赛迪网 > IT技术 Java > Java大图列表
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

Serializable java序列化

发布时间:2008.03.14 04:57     来源:赛迪网    作者:angel4070

1、实现Serializable回导致发布的API难以更改,并且使得package-private和private
这两个本来封装的较好的咚咚也不能得到保障了
2、Serializable会为每个类生成一个序列号,生成依据是类名、类实现的接口名、
public和protected方法,所以只要你一不小心改了一个已经publish的API,并且没有自
己定义一个long类型的叫做serialVersionUID的field,哪怕只是添加一个getXX,就会
让你读原来的序列化到文件中的东西读不出来(不知道为什么要把方法名算进去?)
3、不用构造函数用Serializable就可以构造对象,看起来不大合理,这被称为
extralinguistic mechanism,所以当实现Serializable时应该注意维持构造函数中所维
持的那些不变状态
4、增加了发布新版本的类时的测试负担
5、1.4版本后,JavaBeans的持久化采用基于XML的机制,不再需要Serializable
6、设计用来被继承的类时,尽量不实现Serializable,用来被继承的interface也不要
继承Serializable。但是如果父类不实现Serializable接口,子类很难实现它,特别是
对于父类没有可以访问的不含参数的构造函数的时候。所以,一旦你决定不实现
Serializable接口并且类被用来继承的时候记得提供一个无参数的构造函数
7、内部类还是不要实现Serializable好了,除非是static的,(偶也觉得内部类不适合
用来干这类活的)
8、使用一个自定义的序列化方法  看看下面这个保存一个双向链表的例子:

public class StringList implements Serializable{?private int size = 0;?private Entry head = null;?

?private static class Entry implements Serializable?

{? String data;? Entry next;? Entry previous;?}

?...//Remainder ommitted}

这样会导致链表的每个元素以及元素之间的关系(双向链表之间的连接)都保存下来,更好的方法是提供一个自定义的序列化如下:


public class StringList implements Serializable

{?private int size = 0;?private Entry head = null;

??private static class Entry implements Serializable?

{? String data;? Entry next;? Entry previous;?}?...//Remainder ommitted}



这样会导致链表的每个元素以及元素之间的关系(双向链表之间的连接)都保存下来,更好的方法是提供一个自定义的序列化如下:


//String List with a resonable custom serialized formclass 

StringList implements Serializable{? private transient int size = 0;?????? //!

transient? private transient Entry head = null;? //!

transient? ? //no longer serializable!? private static class Entry? 

{??? String data;??? Entry next;??? Entry previous;? }?

 ? //Appends the specified string to the list? public void add

(String s) {/*...*/};? ? /**?? * Serialize this StringList instance ?

? * @author yuchifang?? * @serialData The size of the list

 (the number of strings   * it contains) is emitted

(int), in the proper sequence?? */? private void writeObject

(ObjectOutputStream s)               

throws IOException? {??? s.defaultWriteObject();??? s.writeInt(size);?
          (责任编辑:包春林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 设计及设计模式:java23种模式一点就通 (03-13) · 关于Java数据对象JDO 2.0查询语言的特点 (03-13)
· J2EE综合:如何实现javabean的属性拷贝 (03-13) · Java入门:Java语言中Timer类的简洁用法 (03-13)
· Java语言中不同类型的转换和提升 (03-12) · J2EE综合:Java学习:EJB的专用术语解释 (03-12)
· 数据库相关--Hibernate的事务和并发 (03-12) · spring提供的事务管理 (03-12)
· 如何应用EditPlus配置Java编译环境 (03-11) · JSWDK环境配置安装 (03-11)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 中小企业网站建设存在弊端 手机实名推波助澜
· CIO应如何克服三个关键错误信念 CIO委屈定理
· 五条黄金准则能够让CIO巧妙加薪 CIO焦虑调查
· 网上书店解决方案 深圳边检指挥中心ITSM项目
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统