java序列化 java.io.Serializable和java.io.Externalizable【转】
2009-10-31 06:00
351 查看
即使你没有用过对象序列化(serialization),你可能也知道它。但你是否知道 Java 还支持另外一种形式的对象持久化,外部化(externalization)?
下面是序列化和外部化在代码级的关联方式:
public interface Serializable {}
public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}
序列化和外部化的主要区别
外部化和序列化是实现同一目标的两种不同方法。下面让我们分析一下序列化和外部化之间的主要区别。
通过Serializable接口对对象序列化的支持是内建于核心 API 的,但是java.io.Externalizable的所有实现者必须提供读取和写出的实现。Java 已经具有了对序列化的内建支持,也就是说只要制作自己的类java.io.Serializable,Java 就会试图存储和重组你的对象。如果使用外部化,你就可以选择完全由自己完成读取和写出的工作,Java 对外部化所提供的唯一支持是接口:
voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)
现在如何实现readExternal() 和writeExternal() 就完全看你自己了。
序列化会自动存储必要的信息,用以反序列化被存储的实例,而外部化则只保存被存储的类的标识。当你通过java.io.Serializable接口序列化一个对象时,有关类的信息,比如它的属性和这些属性的类型,都与实例数据一起被存储起来。在选择走Externalizable这条路时,Java 只存储有关每个被存储类型的非常少的信息。
每个接口的优点和缺点
Serializable接口
· 优点:内建支持
· 优点:易于实现
· 缺点:占用空间过大
· 缺点:由于额外的开销导致速度变比较慢
Externalizable接口
· 优点:开销较少(程序员决定存储什么)
· 优点:可能的速度提升
· 缺点:虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上。
在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最简单的解决方案,但是它可能会导致出现不可接受的性能问题或空间问题;在出现这些问题的情况下,Externalizable可能是一条可行之路。
要记住一点,如果一个类是可外部化的(Externalizable),那么Externalizable方法将被用于序列化类的实例,即使这个类型提供了Serializable方法:
private void writeObject()
private void readObject()
http://tech.ddvip.com/2009-04/1239966580115648.html 序列化的作用
http://topinking.javaeye.com/blog/226401 相关代码
http://renyangok.javaeye.com/blog/45404 版本问题
http://hi.baidu.com/lightingman/blog/item/0e3d6dfd9971644cd7887d14.html 概要性的说明
困惑:一般将对象序列化后方可在网络上进行传输,但是一个JAVAWEB的项目,即使是采用SSH框架(我指的不是那种远程传输,如RMI等项目),对象的传递也无非就是在服务器机上啊,没有跨网络啊,更别提在网络上传输对象,那为什么javabean、Hibernate的PO类等都推荐被序列化?
解答:在hibernate里,并非所有的实体类必须实现序列化接口,因为在hibernate中我们通常是将基本类型的数值映射为数据库中的字段。而基础类型都实现了序列化接口(String也实现了)。 所以,只有在想将一个对象完整存进数据库(存储为二进制码),而不是将对象的属性分别存进数据库,读取时再重新构建的话,就可以不用实现序列化接口。 实现了Serializable,可以方便保存数据。
1,序列化与反序列化:ObjectOutputStream、writeObject()、readObject();接口Externalizable需要实现writeExternal()和readExternal()
2,序列化的版本问题:
下面是序列化和外部化在代码级的关联方式:
public interface Serializable {}
public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}
序列化和外部化的主要区别
外部化和序列化是实现同一目标的两种不同方法。下面让我们分析一下序列化和外部化之间的主要区别。
通过Serializable接口对对象序列化的支持是内建于核心 API 的,但是java.io.Externalizable的所有实现者必须提供读取和写出的实现。Java 已经具有了对序列化的内建支持,也就是说只要制作自己的类java.io.Serializable,Java 就会试图存储和重组你的对象。如果使用外部化,你就可以选择完全由自己完成读取和写出的工作,Java 对外部化所提供的唯一支持是接口:
voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)
现在如何实现readExternal() 和writeExternal() 就完全看你自己了。
序列化会自动存储必要的信息,用以反序列化被存储的实例,而外部化则只保存被存储的类的标识。当你通过java.io.Serializable接口序列化一个对象时,有关类的信息,比如它的属性和这些属性的类型,都与实例数据一起被存储起来。在选择走Externalizable这条路时,Java 只存储有关每个被存储类型的非常少的信息。
每个接口的优点和缺点
Serializable接口
· 优点:内建支持
· 优点:易于实现
· 缺点:占用空间过大
· 缺点:由于额外的开销导致速度变比较慢
Externalizable接口
· 优点:开销较少(程序员决定存储什么)
· 优点:可能的速度提升
· 缺点:虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上。
在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最简单的解决方案,但是它可能会导致出现不可接受的性能问题或空间问题;在出现这些问题的情况下,Externalizable可能是一条可行之路。
要记住一点,如果一个类是可外部化的(Externalizable),那么Externalizable方法将被用于序列化类的实例,即使这个类型提供了Serializable方法:
private void writeObject()
private void readObject()
http://tech.ddvip.com/2009-04/1239966580115648.html 序列化的作用
http://topinking.javaeye.com/blog/226401 相关代码
http://renyangok.javaeye.com/blog/45404 版本问题
http://hi.baidu.com/lightingman/blog/item/0e3d6dfd9971644cd7887d14.html 概要性的说明
困惑:一般将对象序列化后方可在网络上进行传输,但是一个JAVAWEB的项目,即使是采用SSH框架(我指的不是那种远程传输,如RMI等项目),对象的传递也无非就是在服务器机上啊,没有跨网络啊,更别提在网络上传输对象,那为什么javabean、Hibernate的PO类等都推荐被序列化?
解答:在hibernate里,并非所有的实体类必须实现序列化接口,因为在hibernate中我们通常是将基本类型的数值映射为数据库中的字段。而基础类型都实现了序列化接口(String也实现了)。 所以,只有在想将一个对象完整存进数据库(存储为二进制码),而不是将对象的属性分别存进数据库,读取时再重新构建的话,就可以不用实现序列化接口。 实现了Serializable,可以方便保存数据。
1,序列化与反序列化:ObjectOutputStream、writeObject()、readObject();接口Externalizable需要实现writeExternal()和readExternal()
2,序列化的版本问题:
相关文章推荐
- java序列化 java.io.Serializable和java.io.Externalizable【转】
- java.io 序列化 总结(一)---Serializable 和 Externalizable 的区别与联系
- java io系列06之 序列化总结(Serializable 和 Externalizable)
- java.io 序列化 总结(一)---Serializable 和 Externalizable 的区别与联系
- java io系列06之 序列化总结(Serializable 和 Externalizable)
- java.io 序列化 总结Serializable 和 Externalizable 的区别与联系,以及输出后的乱码问题
- JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)
- java IO 流Stream 序列化Serializable 文件File
- JAVA序列化基础知识Serializable与Externalizable的区别
- java序列化java.io.Externalizable
- java.io.NotSerializableException: 没实现序列化对象而写入文件流的报错
- java.io.Serializable(序列化)接口详细总结
- [Java 12 IO] Serializable 初步 ObjectOutputStream ObjectInputStream 将序列化的对象打出来
- JAVA序列化基础知识Serializable与Externalizable的区别
- java对象序列化java.io.Serializable 接口实践
- 在序列化和返序列化深拷贝java对象时出现的 java.io.NotSerializableException
- 序列化java.io.Serializable
- 序列化 java.io.Serializable
- java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化?
- java.io.Serializable序列化接口类及编码表