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,说明被序列化了,此处还有待继续研究。。

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