java--序列化和還原序列化

來源:互聯網
上載者:User

標籤:欄位   sys   nal   賦值   str   uuid   system   自身   模式   

一、序列化

java序列化的過程是把對象轉換為位元組序列的過程

序列化的兩種用途:

  1)把對象的位元組序列永久儲存大搜硬碟上,通常存放到一個檔案中

  2)在網路上傳送對象的位元組序列

jdk中的序列化API:

java.io.ObjectOutputStream :表示對象輸出資料流,他的writeObject(Object obj)方法可對參數制定的ibj對象進行序列化,把得到的位元組序列寫到一個目標輸出資料流中。

java.io.ObjectInputStream  :表示對象輸入資料流,他的readObject()方法從一個源輸入資料流中讀取位元組序列,再把他們還原序列化為一個對象,並將其返回。

只有實現了Serializable和Externalizable介面的類的對象才能被序列化。Externalizable介面繼承自Serializable介面,實現Externalizable介面的類完全由自身來控制序列化的行為,而實現了Serializable介面的類可以採用預設的序列化方式。

二、對象序列化的步驟:

  1、建立一個對象輸出資料流,它可以封裝一個其他類型的源輸入資料流,如檔案輸入資料流(IO流 裝飾者模式)

  2、通過對象輸出資料流的writeObject()方法寫對象

對象還原序列化額步驟:

  1、新建立一個對象輸入資料流,它可以封裝一個其他類型的源輸入資料流,如檔案輸入資料流

  2、通過對象輸入資料流的readObject()方法讀取對象

 

程式碼範例:

Person.java  

public class Person implements Serializable {    private int age;    private String name;    private String sex;    @Override    public String toString() {        return "Person{" +                "age=" + age +                ", name=‘" + name + ‘\‘‘ +                ", sex=‘" + sex + ‘\‘‘ +                ‘}‘;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public Person(int age, String name, String sex) {        this.age = age;        this.name = name;        this.sex = sex;    }}

序列化和還原序列化person對象  序列化後的Person.txt檔案中亂碼 因為序列化的過程是將對象變成二進位儲存的

public static void SerializePerson() throws IOException {        Person person=new Person(15,"xiaoming","nan");        //ObjectOutputStream 對象輸出資料流,將PersonObject Storage Service到Person.txt檔案,完成對Person對象的序列化        ObjectOutputStream oo=new ObjectOutputStream(new FileOutputStream(new File("classpath:Person.txt")));        oo.writeObject(person);        System.out.println("serialize complete");        oo.close();    }

還原序列化的過程:

public static void Deserialize() throws IOException, ClassNotFoundException {        ObjectInputStream ois=new ObjectInputStream(new FileInputStream("classpath:Person.txt"));        Person person = (Person) ois.readObject();        System.out.println(person.toString());        System.out.println("deserialize complete");        ois.close();    }

運行兩個過程:

serialize completePerson{age=15, name=‘xiaoming‘, sex=‘nan‘}deserialize complete

忽然想起了transient關鍵字:做了個小改動

為Person類添加一個transient修飾的ext欄位 建立person對象時為ext賦值 進行序列化,並且還原序列化

public class Person implements Serializable {    private int age;    private String name;    private String sex;    private transient String ext;

序列化的person.txt檔案中沒有ext 還原序列化的person對象的ext為null

serialize completePerson{age=15, name=‘xiaoming‘, sex=‘nan‘, ext=‘null‘}deserialize complete

 

三、serialVersionUUID的作用

serialVersionUUID:序列化版本號碼,凡是實現Serializable介面的類都有一個表示序列化版本表示的靜態變數(沒有自動產生 也沒有警告)

將Person序列化後再為Person類添加一個屬性,再進行還原序列化 還原序列化失敗

 

java--序列化和還原序列化

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.