Java-序列化(Serializable)

  • Post author:
  • Post category:java




一、序列化和反序列化

序列化:将对象转化为字节流的形式保存在磁盘上或用于网络传输。

反序列化:将从磁盘上读取或从网络上接收到的字节流转化为序列化前的对象。



二、实现方式

给需要序列化的类实现Serializable接口.

public class User implements Serializable {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}



三、案例

数据流:ObjectOutputStream & ObjectInputStream

只能作用在基本数据类型和引用数据类型上。

将序列化后的对象写入磁盘

@Test
    public void write() throws IOException {
        File file = new File("D:\\test.txt");
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        User user = new User();
        user.setId(1L);
        user.setName("Ben");
        oos.writeObject(user);
    }

打开test.txt

 sr com.wsh.pojo.User)Ua( L idt Ljava/lang/Long;L namet Ljava/lang/String;xpsr java.lang.Long;嬩愄?? J valuexr java.lang.Number??  xp       t Ben

读取test.txt中的内容并进行反序列化

@Test
    public void read() throws IOException, ClassNotFoundException {
        File file = new File("D:\\test.txt");
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        System.out.println(ois.readObject());
        //输出结果:User{id=1, name='Ben'}
    }



四、serialVersionUID

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 在进行反序列化前,会将字节流中的serialVersionUID和本地实体类中的serialVersionUID进行比较,相同则进行反序列化,不同则出现异常java.io.InvalidClassException。
  • serialVersionUID如不显示声明,则会根据类的结构生成一个隐式的值。



五、transient

若声明变量时有关键字transient,则该变量不会参与序列化,反序列化得到的结果为默认初始化的值。



六、静态变量不参与序列化



版权声明:本文为qq_25243147原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。