`
xinglongbing
  • 浏览: 147196 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

序列化与反序列化

阅读更多

序列化与反序列化( Serializable and Deserializable)实现机制分析:
什么是序列化:通过序列化你可以将一个对象保存在文件中、数据库中,可以使得对象可以在网络上进行传送。
而这些都是通过将对象转化为字节流存储到文件中,或传输到网络的另一端;利用这些字节流可以重新恢复为原来的对象。

Java序列化具有以下特点:
1.不必关心对象字节数据的底层表示和字节序等问题,因此能够在不同平台进行传输和使用。
2.对象里面的复杂关系由由系统自动维护,里面整个对象网(深度拷贝)由系统自动完成。
3.主要支持RMI和JavaBeans。

序列化中应该注意的问题:
1.序列化即保存对象的状态等信息,在进行反序列化的时候需要找到原有的类模板重新构造原有对象,因此类是序列化和反序列化的基础。
2.默认的序列化机制会根据类文件中:字段、方法等信息生成一个serialVersionUID(如果没有定义的话,这是一个final long static字段),在进行反序列化的时候首先要比较ID是否一致否则会导致不能反序列化。为了保持
3.小心序列化可能破坏对象的单例性。

从上面的第二点我们应该谨慎将一个类实现Serializable接口,因为一旦对象是可序列化的,那么对类的任何修改都可能导致反序列化的失败。当然若在类中指定其serialVersionUID则不会出现此种问题。今日实验室就碰到了此种问题,原有的平台搭建了一个非常复杂的实验,并将实验序列化到一个文件中,由于里面涉及的类没有指定serialVersionUID,因此给后来软件的升级带来了麻烦。一旦修改里面涉及的类就会导致辛辛苦苦搭建的实验不能被反序列化从而要重新做一遍。不过网上的XStream这个工具提供了解决此问题的可能,它可以将对象序列化到一个xml文件,其中对每个对象及属性都添加了相应的标记进行说明。这样避免了Java中默认的序列化机制将对象以字节的形式进行传输或保存导致可读性差的缺点。当然XML实验文件会比原有字节文件大许多,因为添加了很多额外的标记。不过该中方法为我们平滑过渡到新的软件版本提供了方法。因为XML文件是结构化数据,因此可以针对在类中新添加的特性手动进行编辑和修改,从而过渡到符合新类文件的对象格式:
old字节实验文件-----oldXML实验文件-------新的XML实验文件------新的字节实验文件

这样便可成功过渡到新的版本上来。

 

XStream在Applet中使用会出现安全性异常,网上资料说是:XStream在客户机上会创建ClassLoader,具体原因还有待进一步分析。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics