您的位置:首页 > 编程语言 > Java开发

Java 序列化Serializable

2016-06-03 17:35 459 查看
一.什么是序列化和反序列化

序列化(Serialization)是一种将对象用一连串的字节描述的过程,反序列化(Deserialization)是一种将这些字节再重新建成一个对象的过程。

二.什么时候需要序列化

1.想要把内存中的对象保存到一个文件中或数据库的时候

2.想要用套接字在网络上传送对象的时候

3.想通过RMI(远程方法调用)传输对象的时候

三.如何实现序列化

将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。

四.序列化ID

序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),建议如果没有特殊需求,就使用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。不过这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。

五.序列化前和序列化后的对象的关系

是 "=="还是equal? 是浅复制还是深复制? 

答案:是深复制,反序列化还原后的对象地址与原来的的地址不同。

序列化前后对象的地址不同了,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的”深度复制(deep copy)"——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。

六.静态变量能否序列化

序列化会忽略静态变量,即序列化不保存静态变量的状态。静态成员属于类级别的,所以不能序列化。即序列化的是对象的状态不是类的状态。这里的不能序列化的意思,是序列化信息中不包含这个静态成员域。

七.总结:

1.当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

2.当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

3. static,transient后的变量不能被序列化;

注:

1.使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量

2.我们可以在其它地方去读取该文件以还原对象,但必须确保该读取程序的CLASSPATH中包含有
对象.class(哪怕在读取对象时并没有显示地使用 对象类),否则会抛出ClassNotFoundException。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Serializable 序列化