| 
                         接下来,我们继续编写测试代码,尝试将之前持久化写入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                         (编辑:我爱故事小小网_铜陵站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |