接下来,我们继续编写测试代码,尝试将之前持久化写入user.txt文件的对象数据再次转化为Java对象,代码如下:
- 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();
- }
- }
通过反序列化操作,可以再次将持久化的对象字节流数据通过IO转化为Java对象,结果如下:
- cn.wudimanong.serializable.User@6f496d9f
此时,如果我们再次尝试将User实现Serializable接口的代码部分去掉,发现也无法再文本转换为序列化对象,报错信息为:
- ava.io.InvalidClassException: cn.wudimanong.serializable.User; class invalid for deserialization
- at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:157)
- at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:862)
- at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2038)
- at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1568)
- at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)
- at cn.wudimanong.serializable.SerializableTest.readObj(SerializableTest.java:31)
- at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:44)
提示非法类型转换异常,说明在Java中如何要实现对象的IO读写操作,都必须实现Serializable接口,否则代码就会报错!
序列化&反序列化
通过上面的阐述和示例,相信大家对Serializable接口的作用是有了比较具体的体会了,接下来我们上层到理论层面,看下到底什么是序列化/反序列化。序列化是指把对象转换为字节序列的过程,我们称之为对象的序列化,就是把内存中的这些对象变成一连串的字节(bytes)描述的过程。
而反序列化则相反,就是把持久化的字节文件数据恢复为对象的过程。那么什么情况下需要序列化呢?大概有这样两类比较常见的场景:1)、需要把内存中的对象状态数据保存到一个文件或者数据库中的时候,这个场景是比较常见的,例如我们利用mybatis框架编写持久层insert对象数据到数据库中时;2)、网络通信时需要用套接字在网络中传送对象时,如我们使用RPC协议进行网络通信时;
关于serialVersionUID
(编辑:ASP站长网)
|