`
Tony_Lee-S
  • 浏览: 81644 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

可序列化接口Serializable

阅读更多
Serializable接口是一种标记性接口。因为它没有方法,所以,不需要在类中为实现Serializable接口增加额外的代码。实现这个接口可以启动Java的序列化机制,自动完成存储对象和数组的过程。

为了体会这个自动和理解对象是如何存储的,考虑一下不使用这一功能,储存一个对象需要做哪些工作。假设要存储一个JButton对象,为了完成这个任务,需要存储该对象所有属性(例如,颜色、字体、文本和对齐方式)的当前值。由于JButton是AbstractButton的一个子类,所以,必须把AbstractButton的属性值和AbstractButton所有父类的属性值都存储起来。如果某个属性是对象类型的(例如,background是Color类型的),存储它就要求这个对象的所有属性值。如你所见,这是一个非常烦琐冗长的过程。幸运的量,不必手工完成这个过程。Java提供一个内在机制自动完成写对象的过程。这个过程称为对象序列化,它是在ObjectOutputStream中实现的。与此相反,读取对象的过程称作对象反序列化,它是在ObjectInputStream类中实现的。

许多Java API中的类都实现了Serializable接口。工具类如java.util.Date以及所有的Swing GUI组件类都实现了Serializable接口。试图存储一个不支持Serializable接口的对象会引起一个NotSerializableException异常。

当存储一个可序列化对象时,会对该对象的类进行编码。编码包括类名、类的签名、对象实例变量的值以及从初始对象引用的任何其他对象的闭包,但是不存储对象静态变量的值。

非序列化的数据域:如果一个对象是Serializable的实例,但它包含的都是非序列化的数据域,那么可以序列化这个对象吗?答案是否定的。为了使该对象是可序列化的,需要给这些数据域加上关键字transient,告诉Java虚拟机将对象写入对象流时忽略这些数据域。考虑下面的类:

public class Foo implements java.io.Serializable {
    private int v1;
    private static double v2;
    private transient A v3 = new A();
}

class A {
    ...
 }//A is not serializable

当Foo类的一个对象进行序列化时,只需序列化变量v1。因为v2是一个静态变量,所以没有序列化。因为v3标记为transient,所以也没有序列化。如果v3没有标记为transient,将会发生异常java.io.NotSerializableException。
复制对象:如果一个对象不止一次写入对象流,会存储对象的多份副本吗?答案是不会。第一次写入一个对象时,就会为它创建一个序列号。Java虚拟机将对象的所有内容和序列号一起写入对象流。以后每次存储时,如果写入相同的对象,就只存储序列号。读出这些对象时,它们的引用相同,因为在内存中实际上存储的只是一个对象。
上传一篇网上找的文章,如有不明白可以下载来看~
分享到:
评论

相关推荐

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

    在Java中,通过实现`Serializable`接口,可以方便地进行对象的序列化操作。序列化的核心在于能够将对象的状态转换为可以存储或传输的形式,从而实现对象的持久化和远程通信等功能。 #### 二、序列化的应用场景 ...

    Android序列化——Serializable与Parcelable

    只需让类实现Serializable接口,系统就会自动处理序列化和反序列化。使用`writeObject()`和`readObject()`方法可以自定义序列化的行为。 优点: - 实现简单,只需要在类上添加`implements Serializable`即可。 - ...

    序列化 serializable demo

    首先,`Serializable`接口是Java中用于实现序列化的标志接口。它没有定义任何方法,但当一个类实现了这个接口,Java的ObjectOutputStream就可以将该类的对象写入到流中。例如,`MySerializable.java`和`Product.java...

    java serializable 序列化与反序列化

    `Serializable`接口是Java提供的一个标记接口,用于实现对象的序列化。当一个类实现了这个接口,它的实例就可以被序列化。 **一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换...

    用序列化(Serializable)保存、读取对象

    序列化接口介绍** Java中的序列化是通过实现`java.io.Serializable`接口来标记一个类可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅仅表示该类的对象可以被序列化。如果你希望一个类的实例能够被序列...

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

    Java中的序列化主要是通过实现`Serializable`接口完成的,该接口没有声明任何方法,是一个标记接口。实现这个接口的类会被认为是可以被序列化的。 #### 关键属性`serialVersionUID` 1. **作用**:`...

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

    `Externalizable`接口允许对象完全控制序列化过程,而仅实现`Serializable`接口的类则采用默认的序列化方式。对于那些不希望被序列化的类或字段,可以使用`transient`或`volatile`关键字标记,它们会被忽略在序列化...

    IDEA中实体类实现了序列化接口

    ### IDEA中实体类实现序列化接口与序列化ID生成 #### 一、序言 在Java开发中,序列化是一项非常重要的技术,它允许将对象的状态转换为字节流,从而方便在网络上传输或者存储到磁盘上。为了保证序列化的兼容性与...

    Java 串行化(序列化)Serializable/Externalizable

    1. **默认序列化**:简单地实现Serializable接口,无需额外代码,适合字段较少且不关心序列化细节的场景。 2. **自定义序列化**:通过实现Externalizable接口,自定义序列化和反序列化逻辑,适合需要优化性能或有...

    PHP自定义序列化接口Serializable用法分析

    让我们通过一个具体的例子来分析PHP自定义序列化接口Serializable的用法。首先,我们定义一个实现了Serializable接口的类,这个类叫做obj。在这个类中,我们定义了一个私有成员变量$data用于存储数据,以及一个成员...

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

    要实现序列化,对象的类必须实现`Serializable`接口。这通常意味着在类声明中添加`implements Serializable`。然后,可以使用`ObjectOutputStream`将对象写入文件,如下所示: - 创建`FileOutputStream`以指向要...

    24、序列化 Serializable1

    - 为了让一个类支持序列化,只需让该类实现`java.io.Serializable`接口。这个接口没有定义任何方法,只是一个标记接口,表明类的对象可以被序列化。 4. **序列化ID** - `serialVersionUID`是一个长整型字段,用于...

    序列化类的作用Serializable

    如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,但是父类的字段不会被序列化,除非父类中声明了`transient`或`volatile`的字段。 在序列化过程中,有时需要对特定类的字段进行特殊处理。...

    序列化,反序列化,接口

    例如,当我们需要在网络间传递对象时,可以定义一个接口,所有可传输的对象都实现这个接口,并进行序列化。接收端反序列化后,可以根据接口进行统一处理,而无需了解具体实现类的细节。 总结来说,序列化和反序列化...

    Java_Serializable(序列化)的理解和总结

    在Java中,如果一个类实现了`Serializable`接口,那么该类的对象就可以被序列化。序列化的目的是为了能够持久地保存对象的状态,或者在网络中传递对象。 序列化主要关注的是对象的状态(即其实例变量),而不是其...

    Serializable序列化

    这个接口没有任何方法需要实现,仅仅是一个标记接口,表明该类的实例是可序列化的。但是,需要注意的是,序列化会将对象的所有字段都包含进去,包括transient和static修饰的字段。`transient`字段不会被序列化,因为...

    java序列化和反序列化的方法

    在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...

    析Android中的Serializable序列化.rar_Serializable _android

    在Android开发中,Serializable接口是实现对象序列化的重要方式,它是Java平台标准的一部分,但在Android环境中也有广泛的应用。本文将深入探讨Android中的Serializable序列化机制,包括其原理、使用场景以及注意...

    java.io.Serializable序列化问题

    序列化的核心接口是 `java.io.Serializable`,它是一个标记接口,没有定义任何方法,用于标记可以被序列化的类。 #### 二、实现序列化的方法 为了使一个类支持序列化,需要让该类实现 `Serializable` 接口。实现这...

Global site tag (gtag.js) - Google Analytics