java中對象的序列化與反序列化

1、什麼是序列化?

序列化指的是將實例化的對象轉化爲字節流,反序列化指的是將字節流還原爲原先的對象。有點像《三體》裏邊生命脫水後變成一張圖片,然後又能還原成活生生的生命。

2、爲什麼要序列化?

(1)、序列化後,對象的信息轉化爲字符流,便於網絡間對象的傳輸。

(2)、可以實現對象的持久化。

3、怎麼序列化?

public class Person implements Serializable
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    transient private String name;

    private int age = -1;

    private String sex;

    private static Integer height = 180;

    public String toString()
    {
        StringBuffer sb = new StringBuffer();
        sb.append("name:" + name);
        sb.append("age:" + age);
        sb.append("sex:" + sex);
        sb.append("height:" + height);
        return sb.toString();
    }

    public static void main(String[] args) throws Exception
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\\\person1.obj"));
        oos.writeObject(new Person("小明", 15, "男", 170));
        oos.close();
        ObjectInputStream ors = new ObjectInputStream(new FileInputStream("F:\\\\person1.obj"));
        Person person1 = (Person) ors.readObject();
        System.out.println(person1.toString());
    }

    public static Integer getHeight()
    {
        return height;
    }

    public static void setHeight(Integer height)
    {
        Person.height = height;
    }

    public Person(String name, int age, String sex, Integer height)
    {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
    }

    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;
    }

    public String getSex()
    {
        return sex;
    }

    public void setSex(String sex)
    {
        this.sex = sex;
    }
}


(1)、類的對象要想序列化,這個類必須繼承Serializable(還有其他幾種方式,先暫時不提)。

Serializable是一個空的接口,源碼裏邊沒有聲明任何方法。

(2)、序列化代碼:

public static void main(String[] args) throws Exception
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:\\\\person1.obj"));
        oos.writeObject(new Person("小明", 15, "男", 170));
        oos.close();

        ObjectInputStream ors = new ObjectInputStream(new FileInputStream("F:\\\\person1.obj"));
        Person person1 = (Person) ors.readObject();
        System.out.println(person1.toString());// name:nullage:15sex:男height:170
    }


(3)、transient修飾的成員變量不會被序列化和反序列化。

(4)、看網上的資料說static修飾的屬性是類的屬性,被對象共享,因此也不會被序列化;但是實際測試,

發現height:170,說明被序列化了,此處還有待繼續研究。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章