在java中如果一个类继承了Serializable接口才可以实现序列化
序列化简单来说就是可以将对象转换成字符流
先定义一个序列化对象User:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String userId;
private String userName;
public User(String userId, String userName) {
this.userId = userId;
this.userName = userName;
}
}
我们先测试将该对象写入一个文件:
public class SerializableTest {
/**
* 将User对象作为文本写入磁盘
*/
public static void writeObj() {
User user = new User("1001", "Joe");
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("/Users/guanliyuan/user.txt"));
objectOutputStream.writeObject(user);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
writeObj();
}
}
运行上述代码,我们就将User对象及其携带的数据写入了文本user.txt中,我们可以看下user.txt中存储的数据此时是个什么格式:
java.io.NotSerializableException: cn.wudimanong.serializable.User
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at cn.wudimanong.serializable.SerializableTest.writeObj(SerializableTest.java:19)
at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:27)
可以看到对象数据以二进制文本的方式被持久化到了磁盘文件中
如果上面代码中将该接口去掉 那么在转换时会出现异常
通过序列化保存的接口可以通过反序列化读取出来
public class SerializableTest {
/**
* 将类从文本中提取并赋值给内存中的类
*/
public static void readObj() {
try {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/Users/guanliyuan/user.txt"));
try {
Object object = objectInputStream.readObject();
User user = (User) object;
System.out.println(user);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
readObj();
}
}
同时如果接口去掉 那么反序列化操作也会失败
序列化是指把对象转换为字节序列的过程,我们称之为对象的序列化,就是把内存中的这些对象变成一连串的字节(bytes)描述的过程。
而反序列化则相反,就是把持久化的字节文件数据恢复为对象的过程。
那么什么情况下需要序列化呢?大概有这样两类比较常见的场景:
1、需要把内存中的对象状态数据保存到一个文件或者数据库中的时候,这个场景是比较常见的,例如我们利用mybatis框架编写持久层insert对象数据到数据库中时;
2、网络通信时需要用套接字在网络中传送对象时,如我们使用RPC协议进行网络通信时;
原文:https://www.cnblogs.com/OfflineBoy/p/15201881.html