微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2EE >

Effective Java (序列化)

时间:2017-01-21 04:01  浏览:努力统计中...
七十五、考虑使用自定义的序列化形式: 设计一个类的序列化形式和设计该类的API同样重要,因此在没有认真考虑好默认的序列化形式是否合适之前,不要贸然使用默认的序列化行为。

七十五、考虑使用自定义的序列化形式:

      设计一个类的序列化形式和设计该类的API同样重要,因此在没有认真考虑好默认的序列化形式是否合适之前,不要贸然使用默认的序列化行为。在作出决定之前,你需要从灵活性、性能和正确性多个角度对这种编码形式进行考察。一般来讲,只有当你自行设计的自定义序列化形式与默认的形式基本相同时,才能接受默认的序列化形式。比如,当一个对象的物理表示法等同于它的逻辑内容,可能就适合于使用默认的序列化形式。见如下代码示例:

1     public class Name implements Serializable {
2 private final String lastName;
3 private final String firstName;
4 private final String middleName;
5 ... ...
6 }

      从逻辑角度而言,该类的三个域字段精确的反应出它的逻辑内容。然而有的时候,即便默认的序列化形式是合适的,通常还必须提供一个readObject方法以保证约束关系和安全性,如上例代码中,firstName和lastName不能为null等。
      下面我们再看一个极端的例子:

1     public final class StringList implements Serializable {
2 private int size = 0;
3 private Entry head = null;
4 private static class Entry implements Serializable {
5 String data;
6 Entry next;
7 Entry previous;
8 }
9 }

      对于上面的示例代码,如果采用默认形式的序列化,将会导致双向链表中的每一个节点的数据以及前后关系都会被序列化。因此这种物理表示法与它的逻辑数据内容有实质性的区别时,使用默认序列化形式会有以下几个缺点:
      1. 它使这个类的导出API永远的束缚在该类的内部表示法上,即使今后找到更好的的实现方式,也无法摆脱原有的实现方式。
      2. 它会消耗过多的空间。事实上对于上面的示例代码,我们只需要序列化数据部分,可以完全忽略链表节点之间的关系。
      3. 它会消耗过多的时间。
      4. 它会引起栈溢出。
     根据以上四点,我们修订了StringList类的序列化实现方式,见如下代码:

 1     public final class StringList implements Serializable {
2 private transient int size = 0;
3 private transient Entry head = null;
4 private static class Entry {
5 String data;
6 Entry next;
7 Entry previous;
8
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------
栏目列表
推荐内容