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

序列化: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 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是...

    JBuider第八章:Java.io包.rar

    Java.io包支持对象的序列化和反序列化,通过实现`Serializable`接口,可以将对象转换为字节流,便于存储或网络传输。 7. **文件操作**: `File` 类是文件和目录操作的主要接口,可以创建、删除、重命名文件和目录...

    java.io.InvalidClassException local class incompatible 处理方法

    在Java序列化过程中,经常会遇到`java.io.InvalidClassException`异常,特别是在序列化类时如果类的版本与反序列化环境中的类版本不一致的情况下。此类异常通常是因为序列化运行时所期望的序列化标识符...

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

    NotSerializableException 是 Java 中的一个异常,它发生在尝试序列化一个不implement Serializable 接口的对象时。今天,我们将讨论 Java 中序列化 NotSerializableException 问题的解决办法。 问题描述 --------...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

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

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

    什么是java序列化,如何实现java序列化?学习.pdf

    1. 将需要被序列化的类实现 Serializable 接口,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream 对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj) 方法就可以将参数...

    Java序列化(Serializable)与反序列化_.docx

    ### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...

    java对象序列化和反序列化

    2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....

    Java序列化(Serializable)与反序列化__1.docx

    `java.io.ObjectOutputStream`和`java.io.ObjectInputStream`是Java标准库中用于序列化和反序列化的类。前者通过`writeObject()`方法将对象写入输出流,后者通过`readObject()`方法从输入流中读取对象。 需要注意的...

    Java序列化_Java序列化结构_

    Java中的序列化主要通过实现`java.io.Serializable`接口来完成。虽然这个接口没有任何方法,但是它的存在就表明该类的对象可以被序列化。当一个对象被序列化时,其所有字段(包括私有的)都会被包含在字节流中,除非...

    Java序列化

    - `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化流程** - 使用 `java....

    java序列化与反序列化

    序列化的实现依赖于`java.io.Serializable`接口。如果一个类想要支持序列化,只需让该类实现这个接口,无需提供任何方法。实现此接口后,Java的默认序列化机制会遍历对象的所有字段并将其写入字节流。请注意,静态...

    什么是java序列化,如何实现java序列化?借鉴.pdf

    Java 序列化机制 Java 序列化是指将一个对象的状态写入一个 Byte 流里,并且可以从其它地方把该 Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到...

    CommonsCollection6反序列化链学习.doc

    CommonsCollection6 反序列化链学习是 Java 中一个常见的反序列化攻击链,攻击者可以利用该链来执行恶意代码。下面我们将详细介绍 CommonsCollection6 反序列化链的原理和实现。 首先,我们需要了解 HashSet 和 ...

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

    实现序列化的关键在于类实现`java.io.Serializable`接口,无须实现任何方法。 5.2.2 序列化应用:除了基础的文件存储和网络传输,序列化也常用于缓存、日志记录、状态备份等场景。 5.2.3 序列化方式:Java中常见的...

    C++ 对象序列化 保存对象.docx

    Java的序列化机制则是语言级别的支持,通过`java.io.Serializable`接口标记类为可序列化。Java的序列化不仅用于持久化对象到文件,还用于RMI(远程方法调用)和网络通信,使得对象可以在不同的Java虚拟机之间传递。...

    java自动序列化

    3. `java.io.NotSerializableException`: 当尝试序列化一个未实现Serializable接口的对象时抛出的异常。 4. `sun.misc.BASE64Encoder`和`sun.misc.BASE64Decoder`(非标准API):用于将字节数组编码为Base64字符串,...

    JAVA对象的序列化与反序列化详细PPT课件.pptx

    另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但提供了更细粒度的控制权,允许类自定义序列化和反序列化的行为。如果一个类实现了`Externalizable`,则需要手动实现`writeExternal...

Global site tag (gtag.js) - Google Analytics