序列化(二): 为什么要序列化?



在readResolve()方法与序列化中, 由readResolve方法想到了序列化, 那为什么要序列化呢? 应该说很久没考虑过类似这样Java底层一点的问题了. 在本篇中, 笔者试着总结归纳下现在我能想到的原因,如有不周或不全的地方请大家多多指正.

为什么要序列化?或者说序列化能带来什么好处? 大致想来有如下几个原因:
1, 支持RMI. 我们知道利用RMI机制可以跨JVM地服务互访,而服务互访肯定是要通信的,也就是说要传递数据的, 对象的序列化这时就提供了数据传送前后的拆装和组装机制.这方面的知道只是理解,工作中也没有真正用过,更进一步说,现在RMI用的很少很少,貌似也没必 要花精力为研究这一块的东西了. Google时,发现一篇文章,记在这里Introduction to Java RMI .
2, 一种对象克隆方式. 利用序列化,我们可以先把某个对象序列化对内存,再反序列化地从内存读出,这样就达到一种变相克隆的效果. 这时的一个注意, 确保要克隆对象里属性及属性的属性都是实现了Serializable接口的, 不然会报NotSerializableException. 下面是可支持泛型的代码:

public static <T> List<T> serializableCloneToArray(T dc, int count) throws Exception {
        List<T> results = new ArrayList<T>();
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream os = new ObjectOutputStream(bo);
        
        os.writeObject(dc);
        
        ByteArrayInputStream bi = null;
        ObjectInputStream oi = null;
        for (int i = 0; i < count; i++) {            
            bi = new ByteArrayInputStream(bo.toByteArray());
            oi = new ObjectInputStream(bi);
            results.add((T) oi.readObject());
        }
        return results;
 }
3, 一种持久化方式. 应该说这个用的更少, 简单来说就是把一些类信息序列化地持久到一个文件中, 再在以后的某个时候从文件中反序列化地读出. 实现方式跟上面的"对象克隆"类似, 只不过是把ByteArrayOutputStream/ByteArrayInputStream分别替换为 FileOutputStream/FileInputStream.

4, 跟GUI的JavaBeans相关. 看Thinking In Java时, 发现这么一段话: Object serialization was added to the language to support two major features: RMI, .....Object serialization is also necessary for JavaBeans, described in the Graphical User Interfaces chapter. When a Bean is used, its state information is generally configured at design time. This state information must be stored and later recovered when the program is started; object serialization performs this task.这里面关于JavaBeans跟序列化有什么关系? 现在还不理解,也没有体会.

除了上面这三个用处/好处外, 还有什么别的? 请大家指正.

你可能感兴趣的:(jvm,工作,bean,OS,Google)