对象流
对象流:ObjectInputStream
和 ObjectOutputStream
可以把内存中的数据(基本数据类型数据,对象的处理流)持久化起来。需要的时候可以还原成内存层面的数据。
序列化:用ObjectOutputStream
类保存基本类型数据或对象的机制。
反序列化:用ObjectInputStream
类读取基本类型数据或对象的机制
对象的序列化机制
要想一个对象可以持久化到一个文件当中,必须保证这个对象所处的类是可序列化的。这个持久化的过程就叫做序列化。同理反序列化也需要保证这个对象所处的类是可序列化的。
当然不仅可以存在持久化到文件,也可以通过网络的方式传输出去。
对象的序列化机制:
允许把内存中的Java对象转换成与平台无关的二进制流,从而允许把这种二进制流持久的保存在硬盘上,或者通过网络将这种二进制流传输到另一个网络节点。—>(序列化)
当其他程序获得了这种二进制流,就可以恢复成原来的Java对象。—>(反序列化)
所以要想将对象持久化或者在网络种传输,首先要将对象进行序列化。
例如:
/**
* Cat需要满足如下要求,方可序列化。
* 1、需要实现接口:Serializable
* 2、当前类提供一个全局常量(序列版本号):serialVersionUID,这个常量的值没有严格要求。
*
* @author zrulin
* @create 2022-04-16 18:25
*/
public class Cat implements Serializable {
private String name;
private Integer age;
public static final long serialVersionUID = 448646413548982L;
public Cat() {
}
public Cat(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
ObjectInputStream 和 ObjectOutputStream
示例代码:
@Test
public void ObjectOutputStreamTest(){
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.abt"));
objectOutputStream.writeObject(new String("我曾经养过一只猫"));
objectOutputStream.flush();
objectOutputStream.writeObject(new Cat("王朝",2));
} catch (IOException e) {
e.printStackTrace();
}finally {
if(objectOutputStream != null){
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test
public void ObjectInputStreamTest(){
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream("object.abt"));
String temp = (String) objectInputStream.readObject();
System.out.println(temp);
Cat cat = (Cat) objectInputStream.readObject();
System.out.println(cat);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally {
if(objectInputStream != null){
try {
objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}