`
westlifesz
  • 浏览: 117542 次
社区版块
存档分类
最新评论

序列化:java.io.Serializable

阅读更多

java.io.Serializable引发的问题——什么是序列化?在什么情况下将类序列化?
 
 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
是对象永久化的一种机制。

   确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。

   只有序列化的对象才可以存储在存储设备上。为了对象的序列化而需要继承的接口也只是一个象征性的接口而已,也就是说继承这个接口说明这个对象可以被序列化了,没有其他的目的。之所以需要对象序列化,是因为有时候对象需要在网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把序列化的对象取出,然后通过网络传到客户端,再由客户端把序列化的对象读入内存,执行相应的处理。

   对象序列化是java的一个特征,通过该特征可以将对象写作一组字节码,当在其他位置读到这些字节码时,可以依此创建一个新的对象,而且新对象的状态与原对象完全相同。为了实现对象序列化,要求必须能够访问类的私有变量,从而保证对象状态能够正确的得以保存和恢复。相应的,对象序列化API能够在对象重建时,将这些值还原给私有的数据成员。这是对java语言访问权限的挑战。通常用在服务器客户端的对象交换上面,另外就是在本机的存储。

   对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口 。
*
Quote:


比较java.io.Externalizable和java.io.Serializable
[URL]http://www.zdnet.com.cn/developer/code/story/0,3800066897,39304080,00.htm[/URL]

即使你没有用过对象序列化(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()
 

 

 
分享到:
评论
5 楼 wintersun 2012-09-03  
sotier 写道
按理说数据持久化都需要实现java.io.Serializable接口,但为什么有的pojo没有实现java.io.Serializable接口也可以持久化到数据库中?


序列化是针对对象(Object in JVM)而言,而持久化尤其是持久化到数据库(Persistent to Database),跟序列化是两个概念。 前者把JVM中的Object对象存储到文件、数据库等任意持久化介质中;后者则只是把任意数据(包括Java Object对象)存储到持久化介质。当然,你可以把前者看成是后者的一个特例!

所以,实现Serializable接口并非是存储到数据库的必要条件;但考虑到Hibernate等ORM带有的缓存机制,可能需要序列化Object对象到硬盘等持久化介质(当然也可能是内存,取决于缓存级别和机制),则一定要实现Serializable接口,否则你的Entity对象无法进行序列号操作。

4 楼 niaotuo 2011-09-01  
第一遍没看懂,第二遍看懂了。
3 楼 niaotuo 2011-09-01  
sotier 写道
按理说数据持久化都需要实现java.io.Serializable接口,但为什么有的pojo没有实现java.io.Serializable接口也可以持久化到数据库中?



序列化是把对象进行处理,使该对象可以在客户端与服务器端传输或可以进行读写操作,而pojo只是个简单的java类,所以不用吧,不知道我说的对不对。
2 楼 sotier 2011-04-01  
按理说数据持久化都需要实现java.io.Serializable接口,但为什么有的pojo没有实现java.io.Serializable接口也可以持久化到数据库中?
1 楼 xueyi_lee 2010-10-18  
嗯,讲得不错,前面大致懂了,呵呵

相关推荐

    java.io.Serializable序列化问题

    java.io.Serializable序列化问题

    java 中序列化NotSerializableException问题解决办法

    主要介绍了java 中序列化NotSerializableException问题解决办法的相关资料,这里对序列化问题进行描述说明,并提供解决办法,希望能帮助到大家,需要的朋友可以参考下

    Android 通过Intent使用Bundle传递对象详细介绍

    被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...

    7.7初始mybatis个人笔记.docx

    java.io.NotSerializableException: ...在mybatis中使用二级缓存时候就必须需要将实体类序列化implements Serializable,我的mapper文件使用了标签,使用了mybatis提供的二级缓存,所以在我的实体类里面必须序列化

    java-Hadoop序列化

     Java序列化(java.io.Serializable)  Hadoop序列化的特点  Hadoop的序列化格式:Writable  序列化格式特点:  紧凑:高效使用存储空间。  快速:读写数据的额外开销小  可扩展:可透明地读取老格式...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...

    java中的IO操作总结(四)

    Serializable序列化 实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import java.io....

    ArgsDemo代码

    对于一些对象的传递,我们则需要把被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable

    在Android中通过Intent使用Bundle传递对象的使用方法

    被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...

    深入分析Java的序列化与反序列化

     为什么实现了java.io.Serializable接口才能被序列化  transient的作用是什么  怎么自定义序列化策略  自定义的序列化策略是如何被调用的  ArrayList对序列化的实现有什么好处  Java对象的序列化  ...

    java序列化和反序列化,面试必备

    最近阅读Serializable接口和Externalizable接口的源码,并结合了一些资料,对面试过程中与序列化相关的内容做了一些总结。 一、序列化、反序列化、使用场景、意义。 序列化:将对象写入IO流中; 反序列化:从IO流中...

    Java序列化与反序列化三种格式存取

     一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。...

    java面试考题

    接口:Connection、Map、List、Set、Comparable(集合比较)、Serializable(序列化)。 包:java.util、java.lang、java.io、java.sql、javax.net、 java.awt、javax.xml 、javax.sevlet。 1.面向对象的特征有哪些? 1...

    netty-JBoss-Marshalling:使用JBoss-marshalling编码包进行java的序列号编码

    netty-JBoss-Marshalling 使用JBoss-marshalling编码包进行java的序列号编码 ...无须实现java.io.Serializable接口,即可实现Java序列化; 通过缓存技术提升对象的序列化性能。 JBoss Marshalling更多是在JBoss内部使

    JAVA基础,常见java基础问题.rar

    2.接口和抽象类有什么区别 接口不能有方法实现,也就是说接口的方法都是抽象方法,但抽象类可以有方法实现。...序列化的实现一般是通过实现Serializable接口,并且会有一个serialVersionUID,这个ID叫做序列化ID

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    J2SE中的序默认序列化

    以下是一个例子: import java.io.*; public class Serial implements Serializable { int company_id; String company_addr; transient boolean company_flag; } 则company_flag字段将不会参与序列化与反序列化,...

    J2SE中的序列化的认识

    只要我们的class 实现了java.io.Serializable接口,就可以利用ObjectOutputStream的writeObject()方法将一个对象序列化;利用ObjectInputStream的readObject()方法,可以返回读出的object对象。Serializable接口...

    串行化和反串行化

    串行化/序列化:将java对象转换成某种格式(JVM定义的)的字节数组 串行化使用场景: 将对象用户网络间传输或者是本地化储存。 反串行化:将字节数组恢复成java对象。 package com.yongjun.io; import java.io....

    整理后java开发全套达内学习笔记(含练习)

    序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit] stack n.堆栈 [stæk] (对应 heap 堆) statement 程序语句; 语句 ['steitmәnt]' n. 陈述,...

Global site tag (gtag.js) - Google Analytics