字符流和字节流,他们的操作对象是:字节(二进制),字符 序列化和反序列化的操作主体对象是:对象和二进制
什么是序列化和反序列化?
序列化:将对象转换成二进制
反序列化:从二进制中将二进制转换成对象(类)
为什么需要序列化和反序列化?
因为系统数据间的交互,一定传输的是二进制对象,而我们编写代码的时候不可能使用二进制进行编写,所以我们编写业务代码的时候使用的是类对象,当别人调用我的API的时候调用的是二进制,因此需要先序列化,将对象转换成二进制进行传输,那么在读取到二进制的时候进行反序列化操作就可以将二进制编程我们能够看懂的对象
序列化和反序列化的作用
-
序列化的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
-
反序列化的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
序列化的优点
-
将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。
-
序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。
-
通过序列化可以在进程间传递对象。
实现序列化的一些方式,如:
1、Java对象序列化: ObjectInputStream(序列化),ObjectOutputStream (反序列化)
2、JSON序列化 (目前最常用)
3、XML(早期使用)
4、Protostuff
5、Hession(它基于HTTP协议传输,使用Hessian二进制序列化,对于数据包比较大的情况比较友好。)
6、Dubbo Serialization(阿里dubbo序列化)
7、FST(高性能、序列化速度大概是JDK的4-10倍,大小是JDK大小的1/3左右)
8、自定义协议进行序列化
序列化操作和反序列化操作
首先定义一个Person类,然后提供get和set方法,且要实现Serializable接口
class Person implements Serializable {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
序列化操作
实现序列化必须实现Serializable接口,如果没有实现这个接口就会报错——NotSerializableException;
序列化代码实现
//序列化
private static void serialization() {
//创建一个Person对象
Person person = new Person();
person.setId(100);
person.setName("Java");
String filePath = "D:\\io_test\\2\\person.txt";
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath))