所谓对象序列化就是将对象的状态转换成字节流以后可以通过这些值再生成相同状态的对象这个过程也可以通过网络实现可以先在Windows机器上创建一个对象对其序列化然后通过网络发给一台Unix机器然后在那里准确无误地重新装配是不是很神奇
也许你会说只了解一点点但从来没有接触过其实未必如此RMISocketJMSEJB你总该用过一种吧彼此为什么能够传递Java对象当然都是对象序列化机制的功劳
第一次使用Java的对象序列化是做某项目当时要求把几棵非常复杂的树(JTree)及相应的数据保存下来(就是我们常用的保存功能)以便下次运行程序时可以继续上次的操作
那时XML技术在网上非常的热而且功能也强大再加上树的结构本来就和XML存储数据的格式很像作为一项对新技术比较有兴趣的我当然很想尝试一下不过经过仔细分析发现如果采用XML保存数据后果真是难以想象哪棵树的哪个节点被展开展开到第几级节点当前的属性是什么真是不知该用ABC还是用来表示
还好发现了Java的对象序列化机制问题迎刃而解只需简单的将每棵树的根节点序列化保存到硬盘上下次再通过反序列化后的根节点就可以轻松的构造出和原来一模一样的树来
其实保存数据尤其是复杂数据的保存正是对象序列化的典型应用最近另一个项目就遇到了需要对非常复杂的数据进行存取通过使用对象的序列化问题同样化难为简
对象的序列化还有另一个容易被大家忽略的功能就是对象复制(Clone)Java中通过Clone机制可以复制大部分的对象但是众所周知Clone有深层Clone和浅层Clone如果你的对象非常非常复杂假设有个层的Collection(夸张了点)如果你想实现深层Clone真是不敢想象如果使用序列化不会超过行代码就可以解决
还有就是Swing组件如果你有两个很象很象(或是一模一样)的比较难以构造的Swing组件你该怎么办也许你想到了Clone但是偏偏Java的Swing组件没有提供Clone方法别急使用序列化行代码搞定
ByteArrayOutputStream
byteOut = new ByteArrayOutputStream();
ObjectOutputStream out
= new ObjectOutputStream(byteOut);
outwriteObject(combo);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOuttoByteArray());
ObjectInputStream in
=new ObjectInputStream(byteIn);
JComboBox comb = (JComboBox)inreadObject();
虽然Java的序列化非常简单强大但是要用好还有很多地方需要注意比如曾经序列化了一个对象可由于某种原因该类做了一点点改动然后重新被编译那么这时反序列化刚才的对象将会出现异常
你可以通过添加serialVersionUID属性来解决这个问题如果你的类是个单态(Singleton)类是否允许用户通过序列化机制复制该类如果不允许你需要谨慎对待该类的实现