浅谈Serializable序列化接口类,以及ObjectOutputStream 输出流和ObjectInoutStream 输入流的使用
序列化: 一个类如果实现了Serializable接口,那么这个类创建的对象就是序列化的对象
需要序列化的三种情况: 1. 将对象存储在硬盘上。 2. 将对象通过网络传输。 3. 通过RMI远程调用等方式传输对象的时候。
作用: Serializable主要作用将类的实例持久化保存,
1、序列化就是保存,也就是将Java对象转换为字节序列的过程。
2、反序列化就是读取,也就是把字节序列恢复为Java对象的过程。
保存也不一定保存在本地,也可以保存到远方。类一定要实现Serializable才可以
实现序列化条件:
1、 该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或· 反序列化,会抛出 NotSerializableException 。
2、 该类的所有属性必须是可序列化的。如有属性不需要可序列化,则该属性必须注明是瞬态的,用transient 关键字修饰。
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
@Data
@ToString
public class CsStudent implements Serializable {
private String name;
private int age;
public CsStudent(String name,int age){
this.name=name;
this.age=age;
}
@Override
public String toString()
{
return name+":"+age;
}
}
如何实现序列化和反序列化:
1、ObjectOutputStream --> 对象的输出流
实现方法-->writeObject(Object obj) --> 对obj对象进行序列化
2、ObjectInoutStream --> 对象的输入流
实现方法-->readObject() --> 读取字节序列,再将它们反序列化成为一个对象返回
// 示例一
// 获取桌面路径
FileSystemView fsv = FileSystemView.getFileSystemView();
File com=fsv.getHomeDirectory();
// 步骤一:创建一个序列化流ObjectOutputSteam对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(com.getPath()+"\\student.txt"));
// 步骤二:写入对象
oos.writeObject(new CsStudent("小懒",18).toString());
oos.flush();// 先请缓存
oos.close();// 再关闭
// 步骤一:读取指定的文件 反序列化,将该对象恢复
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(com.getPath()+"\\student.txt"));
// 步骤二:读取对象
String s = (String)ois.readObject();
System.out.println(s); // 输出: 小懒:18
ois.close();
// 示例二
ByteArrayOutputStream baos=new ByteArrayOutputStream();
for(int i=0;i<5;i++){
baos.write(i);
}
baos.flush();
byte b []= baos.toByteArray();// 输出 [0, 1, 2, 3, 4]
// 将内存中的数据读取出来
ByteArrayInputStream bais = new ByteArrayInputStream(b);
// byte必须传递 内存中的数据转成 byte数组的格式,而不能直接传递一个空数组, 读取出来的数据也是空的
byte[] b2 = new byte[b.length];
System.err.println(Arrays.toString(b2));// 输出[0, 1, 2, 3, 4]
关于序列化 ObjectOutputStream 中文乱码问题: 因为序列化后生成对象输出的本就是字节数据 ObjectOutputStream.writeObject()的作用是把一个实例的对象以文件的形式保存到磁盘上, 这个过程就叫Java对象的持久化。而这个文件是以二进制的形式编写的, 当你用文本编辑器将它打开,这些二进制代码与某个字符集映射之后,显示出来的东西就成了乱码。 即使输出的是一个String的对象,也是以该String对象的二进制编码的形式输出,而不是输出String对象的内容。
扩展
关于IO流的介绍及使用,感兴趣的话可以借鉴下这篇博客:https://blog.csdn.net/qq_42914528/article/details/82260537
上一篇: java实现微信企业付款到个人功能