序列化和反序列化
作者:互联网
序列化理解起来很简单 - 知乎 (zhihu.com)
定义
序列化:把对象转化为可传输的字节序列过程称为序列化。
反序列化:把字节序列还原为对象的过程称为反序列化。
目的
序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组
Java 是如何实现序列化
要实现Serializable 接口
public class User implements Serializable{
//年龄
private int age;
//名字
private String name ;
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;
}
}
写入
FileOutputStream fos = new FileOutputStream("D:\\temp.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
User user = new User();
user.setAge(18);
user.setName("sandy");
oos.writeObject(user);
oos.flush();
oos.close();
读出
FileInputStream fis = new FileInputStream("D:\\temp.txt");
ObjectInputStream oin = new ObjectInputStream(fis);
User user = (User) oin.readObject();
System.out.println("name="+user.getName());
输出结果为:name=sandy
以上把User对象进行二进制的数据存储后,并从文件中读取数据出来转成User对象就是一个序列化和反序列化的过程。
序列化常见问题
- static 属性不能被序列化
序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量
- Transient 属性不会被序列化
读出值为bull
- 父类、子类序列化问题
序列化是以正向递归的形式进行的,如果父类实现了序列化那么其子类都将被序列化;子类实现了序列化而父类没实现序列化,那么只有子类的属性会进行序列化,而父类的属性是不会进行序列化的
(1)子类实现序列化,父类不实现序列化
//父类
public class Parent {
//爱好
private String like;
}
//子类
public class User extends Parent implements Serializable {
//年龄
private int age;
//名字
private String name;
}
//序列化User对象存储到temp.txt
FileOutputStream fos = new FileOutputStream("D:\\temp.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
User user = new User();
user.setName("sandy");
user.setAge(18);
user.setLike("看美女");
oos.writeObject(user);
oos.flush();
oos.close();
//从temp.txt 反序列化转为User对象
FileInputStream fis = new FileInputStream("D:\\temp.txt");
ObjectInputStream oin = new ObjectInputStream(fis);
User user1 = (User) oin.readObject();
System.out.println("like="+user1.getLike());
结果:like=null
父类属性未被序列化
(2)父类实现序列化,子类不实现序列化
//父类
public class Parent implements Serializable{
//爱好
private String like;
}
//子类
public class User extends Parent {
//年龄
private int age;
//名字
private String name;
}
//序列化User对象存储到temp.txt
FileOutputStream fos = new FileOutputStream("D:\\temp.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
User user = new User();
user.setName("sandy");
user.setAge(18);
user.setLike("看美女");
oos.writeObject(user);
oos.flush();
oos.close();
//从temp.txt 反序列化转为User对象
FileInputStream fis = new FileInputStream("D:\\temp.txt");
ObjectInputStream oin = new ObjectInputStream(fis);
User user1 = (User) oin.readObject();
System.out.println("name="+user1.getName());
结果:name=sandy
子类属性序列化正常
标签:name,User,oos,new,序列化,user 来源: https://blog.csdn.net/xinyihhh/article/details/123127615