一、序列化和反序列化
序列化:将对象转化为字节流的形式保存在磁盘上或用于网络传输。
反序列化:将从磁盘上读取或从网络上接收到的字节流转化为序列化前的对象。
二、实现方式
给需要序列化的类实现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 版权协议,转载请附上原文出处链接和本声明。