`

Java中为什么实现了Serializable接口就具备了被序列化的能力以及serialVersionUID的作用

 
阅读更多

Java 规定的内部机制,实现 Serializable 接口就行了,这个接口只是个标记性的接口,表示类的设计者已经允许这个类型的对象被序列化写入磁盘或通过网络发送,对于有保密要求的东西一般不实现这个接口防止无意间复制到 jvm 内存之外。如果一个类型的多数字段可以复制但个别字段不用复制(比如,它实际上是通过其它字段计算出来的),我们可以把它标记为 transient。

默认的 serialization 对类的结构有要求,一般将来版本升级了导致服务端和客户版本不一样,或者你用新版本读取一个以前旧版本写入磁盘的序列化的对象的话,需要这两个版本是兼容的,达到这个要求至少包括下面这个字段,并且新旧两个版本的类中它的值应该是一样的,其它特殊情况规范也有办法做到,比如你的结构变了,以前 name / phone 都是 A 的字段,后来新版本创建了一个内部类叫 Contact 把 name 和 phone
并到这两个字段移到内部类 Contact 中去了的话,Java 也有办法在新版本中提供自定义 readObject/writeObject 这个过程来确保兼容旧版本。

private static final long serialVersionUID; // 在一个类的多个版本中要相同的值,对于不它的类中,它们的值不要求唯一。

http://java.sun.com/developer/technicalArticles/Programming/serialization/

serialVersionUID作用:  序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。  有两种生成方式:  一个是默认的1L,比如:private static final long se...
  serialVersionUID作用:
  序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
  有两种生成方式:
  一个是默认的1L,比如:private static final long serialVersionUID = 1L;
  一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:

 private static final long serialVersionUID = xxxxL;

  当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个
  提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会
  自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也
  可以把它关掉的,设置如下:

 Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==>
 Potential programming problems

  将Serializable class without serialVersionUID的warning改成ignore即可。
  如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable向后兼容。
  如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
  但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。

分享到:
评论

相关推荐

    java serializable 序列化与反序列化

    3. **如何实现序列化**:只需让类实现`Serializable`接口,Java的默认序列化机制就会处理剩余部分。例如: ```java public class MyObject implements Serializable { private String name; private int age; ...

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

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

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

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

    Java对象Serializable接口实现详解

    Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。 Serializable...

    可序列化接口Serializable

    `Serializable`接口在Java中扮演着至关重要的角色,它提供了对象持久化和网络传输的能力。理解并熟练掌握序列化机制,可以帮助开发者在实际项目中解决各种问题,提升代码的可维护性和安全性。通过阅读《Java_序列化...

    java序列化实现演示

    在Java中,如果一个类需要支持序列化,它应该实现`java.io.Serializable`接口。 在Java序列化过程中,`serialVersionUID`扮演着至关重要的角色。`serialVersionUID`是一个长期不变的标识符,用于验证序列化版本的...

    java.io.Serializable序列化问题

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

    序列化类的作用Serializable

    当一个类实现`Serializable`接口后,该类的对象就可以被序列化。这个接口没有定义任何方法,仅仅作为一个标记,表明该类及其所有子类都支持序列化。需要注意的是,实现序列化的类应该谨慎处理其内部状态,因为序列化...

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

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

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

    在Java中,如果一个类需要支持序列化,那么这个类需要实现`java.io.Serializable`接口。实现该接口后,Java虚拟机(JVM)会根据类的信息生成一个序列化ID,即`serialVersionUID`,用于表示类的版本标识。如果序列化ID...

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

    在 serializable-prj 项目中,可能包含了各种示例代码,展示了如何在Java中实现和使用序列化功能。 综上所述,Java的序列化和外部化是实现对象持久化和跨进程通信的关键技术。理解并熟练掌握这些概念,能够帮助...

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

    需要注意的是,只有实现了`Serializable`或`Externalizable`接口的类才能被序列化。`Externalizable`接口允许对象完全控制序列化过程,而仅实现`Serializable`接口的类则采用默认的序列化方式。对于那些不希望被序列...

    序列化 serializable demo

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

    java 对象的序列化与反序列化

    在Java中,序列化(Serialization)是指将一个对象转换为字节流的过程,这个字节流可以保存到磁盘上,或者通过网络进行传输。要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,...

    Java中serialVersionUID的解释

    Java 中的 serialVersionUID 是一个非常重要的概念,在实现 Serializable 接口的类中,它扮演着至关重要的角色。那么,serialVersionUID到底是什么?它又是如何生成的?在本篇文章中,我们将详细地解释 ...

    Java实现序列化例子

    在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口,尽管该接口没有任何方法需要实现,但它的存在就标志着这个类的对象可以被序列化。 首先,我们来看一下`SerializableDemo`这...

    Java序列化

    - Java允许使用 `writeObject()` 和 `readObject()` 方法来自定义序列化和反序列化的行为,这两个方法需要在类中声明为`private`,并由`java.io.Serializable` 接口的实现类提供。 7. **序列化安全性** - 序列化...

    Android通过Parcelable和Serializable实现各种类型嵌套序列化

    实现Serializable接口的类会被自动处理,无需编写额外的序列化代码,但效率相对较低。 1. 在需要序列化的类上添加`implements Serializable`:这样,Java会自动生成序列化所需的元数据,如serialVersionUID。 2. ...

    析Android中的Serializable序列化.rar_Serializable _android

    本文将深入探讨Android中的Serializable序列化机制,包括其原理、使用场景以及注意事项。 一、Serializable接口概述 Serializable接口是Java提供的一种序列化机制,它允许对象的状态被转换成字节流,以便于存储或者...

    Java序列化_Java序列化结构_

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

Global site tag (gtag.js) - Google Analytics