java--序列化和反序列化

1、序列化java

java序列化的過程是把對象轉換爲字節序列的過程網絡

序列化的兩種用途:ide

  1)把對象的字節序列永久保存大搜硬盤上,一般存放到一個文件中this

  2)在網絡上傳送對象的字節序列spa

jdk中的序列化API:code

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

java.io.ObjectInputStream  :表示對象輸入流,他的readObject()方法從一個源輸入流中讀取字節序列,再把他們反序列化爲一個對象,並將其返回。blog

只有實現了Serializable和Externalizable接口的類的對象才能被序列化。Externalizable接口繼承自Serializable接口,實現Externalizable接口的類徹底由自身來控制序列化的行爲,而實現了Serializable接口的類能夠採用默認的序列化方式。繼承

2、對象序列化的步驟:接口

  一、建立一個對象輸出流,它能夠包裝一個其餘類型的源輸入流,如文件輸入流(IO流 裝飾者模式)

  二、經過對象輸出流的writeObject()方法寫對象

對象反序列化額步驟:

  一、新建立一個對象輸入流,它能夠包裝一個其餘類型的源輸入流,如文件輸入流

  二、經過對象輸入流的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 對象輸出流,將Person對象存儲到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 complete
Person{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 complete
Person{age=15, name='xiaoming', sex='nan', ext='null'}
deserialize complete

 

3、serialVersionUUID的做用

serialVersionUUID:序列化版本號,凡是實現Serializable接口的類都有一個表示序列化版本表示的靜態變量(沒有自動生成 也沒有警告)

將Person序列化後再爲Person類添加一個屬性,再進行反序列化 反序列化失敗

相關文章
相關標籤/搜索