这是开始文章http://blog.csdn.net/tlycherry/article/details/8986720。(我引用他人的)最少你要了解到
1、什么是序列化
2、对象流是什么(可以思考下原型模式)
3、序列化能做什么
4、实现序列化的方法
5、序列化的特点
进入正题:
序列化定义:用来将对象编码成字节流,并从字节流编码中重新构建对象。
序列化的好处:一旦一个对象被序列化,它的编码就可以从一台正在运行的虚拟机被传递到另一台虚拟机上,或者被存储到磁盘上,供以后反序列化使用。(对象序列化是java的一个特征,通过该特征可以将对象写作一组字节码,当在其他位置读到这些字节码时,可以依此创建一个新的对象,而且新对象的状态与原对象完全相同。*)
序列化的局限/代价:1、实现序列化接口的类,被发布后,修改的灵活性大大降低。序列化会使得类的演变受到限制,因为序列版本UID
2、增加了出现bug和安全漏洞的可能性。序列化机制是一种语言外的对象创建机制(*是解释)
3、随着发行版本,相关测试负担增加。当一个课序列化的类被修订后,要检查是否可以“在新的版本中序列化一个实例,然后在旧版本中反序列化”反之亦然。
实现序列化的场景:1、如果一个类要加入到某个框架中,并且该框架依赖序列化来实现对象传输或者持久化,这个类需要实现序列化接口。
2、一个类要成为另一个类的组件,并且后者必须实现序列化接口,前者实现序列化接口它就更容易被后者使用。
3、为了继承而设计的类应该尽量少的去实现序列化接口,用户接口也应该尽可能的少继承序列化接口。如果一个专门为了继承而设计的类是不可以序列化的,那就不要编写可以序列化的子类。特别是父类没有提供可以访问的无参构造方法,子类也不可能做到序列化
在为了继承而设计的类中,真正实现了序列化接口的有Throwable类,Component类和HttpServlet抽象类。(是不是之前都没想过为什么要实现序列化接口 就直接借用eclipse这种软件生成了呀)
最好在所有的约束关系都已经建立的情况下再创建对象。如果微力建立这些约束关系而要求客户端提供一些数据,这实际上就排除了使用无参构造器的可能性。盲目地为了一个类增加无参构造器和单独的初始化方法,而它的约束关系仍由其他构造器来建立,这样会使得该类的状态空间更加复杂,并增加了出错的可能性。
一点小经验:Date和Biginteger,大多数集合类应该实现序列化接口,代表活动实体的类不应该实现序列化接口。
实现序列化的时候要慎重。