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
}
这样会导致链表的每个元素以及元素之间的关系(双向链表之间的连接)
都保存下来,更好的方法是提供一个自定义的序列化如下:
//String List with a resonable custom serialized form
class 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);
//Write out all elements in the proper order
for (Entry e = head; e != null; e = e.next)
s.writeObject(e.data);
}
private void readObject(ObjectInputStream s)
throws IOException, ClassNotFoundException
{
int numElements = s.readInt();
//Read in all elements andd insert them in list
for (int i = 0; i < numElements; i++)
add((String)s.readObject());
}
//...remainder omitted
}
UID:private static final long serialVersionUID = randomLongValue;
10、不需要序列化的东西使用transient注掉它吧,别什么都留着。
11、writeObject/readObject重载以完成更好的序列化readResolve
与 writeReplace重载以完成更好的维护invariant controllers
9、不管你选择什么序列化形式,声明一个显式的
分享到:
- 2007-07-10 11:58
- 浏览 2220
- 评论(1)
- 论坛回复 / 浏览 (1 / 3931)
- 查看更多
相关推荐
java 的序列化与反序列化举例测试
java.io.Serializable序列化问题
Serializable序列化步骤
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
Java_Serializable(序列化) 的理解和总结
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一...
序列化 serializable demo ! 序列化 serializable demo !
对于初学者的好东西,可以迅速明白序列化的作用及流程,最基本的代码。
Android序列化——Serializable与Parcelable
什么叫序列化? 我们都知道对象是暂时保存在内存中的,不...在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。 通常网络程序为了传输安全才这么做。不知道回答清晰满意否?
Android中的Serializable
本文实例讲述了C#中Serializable序列化。分享给大家供大家参考。具体分析如下: 概述: 序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中。例如,可以序列化一个对象...
Java 中 Serializable的应用,序列化的作用说明
主要介绍了Android中的Serializable序列化技术,通过Serializable可以需要的朋友可以参考下
Java序列化(Serializable)与反序列化_.docx
Java序列化(Serializable)与反序列化__1.docx
java序列化(Serializable)的作用和反序列化.pdf
本代码就是简单的Parcelable与Serializable序列化,包括bitmap数组如何在应用中传递...