Java序列化與static,Java序列化static

來源:互聯網
上載者:User

Java序列化與static,Java序列化static

簡介:

Java序列化,就是指將一個對象轉化為二進位的byte流(注意,不是bit流),然後以檔案的方式進行儲存。

序列化操作:將對象儲存至檔案;

還原序列化操作:從檔案恢複出對象;


配置:

對象如果要序列化,則必須整合Serializable介面;

在實現序列化時,用ObjectOutputStream實現;

而還原序列化時,用ObjectInputStream實現;


方法:

1. 序列化:

(1) public ObjectOutputStream(OutputStream out) throws IOException

(2) public final void writeObject(Object obj)

(3) public void close() throws IOException


2.還原序列化:

(1) public ObjectInputStream(InputStream in) throws IOException

(2) public final void readObject(Object obj)

(3) public void close() throws IOException


注意:

Java序列化是不能序列化static變數的,因為其儲存的是對象的狀態,而static變數儲存在全域資料區,在對象未執行個體化時就已經產生,屬於類的狀態。

為了方便理解,我們舉例說明:


例子:

首先附上我們要序列化的對象的產生類:

package test;import java.io.Serializable;public class Person implements Serializable{/** *  */private static final long serialVersionUID = 1L;private String name;private int age;public static String test="IBM";public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
這裡我們有static變數test,賦值為IBM。


下面我們來看兩個代碼:

package test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;public class Main{public static void main(String[] args){Person person = new Person();person.setAge(25);person.setName("YXY");Person.test="JAVA"; //modify the test valueFile file = new File("c:/test.txt");try {OutputStream out = new FileOutputStream(file);ObjectOutputStream objout = new ObjectOutputStream(out);objout.writeObject(person);objout.close();} catch (IOException e) {e.printStackTrace();}//code segment 1Person perobj = null;try {InputStream in = new FileInputStream(file);ObjectInputStream objin = new ObjectInputStream(in);perobj = (Person)objin.readObject();System.out.println(perobj.test);in.close();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}
在這段代碼裡,一開始我們就改了static變數test的值為JAVA,然後在code segment 1上面我們首先實現了序列化,接著我們在code segment 1下面實現了還原序列化,讀取對象,運行,我們發現結果是JAVA,這時大家要問了,說不序列化static變數,怎麼讀取出來的還原序列化對象的值,test的值還改變呢?這正是因為我們並沒有序列化static變數,所以它並沒有被寫入流中,所以當我們要讀取test的值時,它不可能在還原序列化的檔案裡找到新的值,而是去全域資料區取值,因為全域資料區的值現在是JAVA,所以讀取出來的值就是改變後的值JAVA了。


下面我們再看一段代碼:

package test;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;public class TEST {public static void main(String[] args){File file = new File("c:/test.txt");//code segment 1Person perobj = null;try {InputStream in = new FileInputStream(file);ObjectInputStream objin = new ObjectInputStream(in);perobj = (Person)objin.readObject();System.out.println(perobj.test);in.close();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}
同樣也是還原序列化操作,只不過放到了另一個檔案裡,這時再運行,結果就是IBM,不再是之前的JAVA,正是因為我們並沒有序列化static變數,所以test的值並不會改變,因為運行這個檔案時,全域資料區裡的static變數也沒有改,所以它一如既往的是它的原始值IBM。


總結,綜上所述,Java序列化是不能序列化static變數的,大家在使用的時候一定不要混淆。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.