`
qianshangding
  • 浏览: 124322 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java序列化及serialVersionUID作用

 
阅读更多

serialVersionUID

serialVersionUID的作用:序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

类实现了Serializable接口时,如果没有定义serialVersionUID,在Eclipse中会提示你去定义,在Eclipse中点击类中的warning图标时,Eclipse提供给我们两种方式去生成serialVersionUID,分别是:
1)默认的1L,如:private static final long serialVersionUID = 1L;
2)根据类名、接口名、包路径、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -4743699992166046319L;

如果希望类的不同版本对序列化兼容,我们就要确保各个不同版本的类要具有相同的serialVersionUID;当然,如果你不希望不同版本的类对序列化兼容,那么不同版本可以具有不同的serialVersionUID。也就是说,当你序列化一个类实例后,如果更改了一个字段,或增加一个字段,不设置serialVersionUID,所做的任何更改都会导致无法反序列化,并且在序列化时抛出异常。如果你增加了serialVersionUID,在反序列化时,新添加或者更改的字段值将会设置成初始值(对象为null,其他基础类型对应相应的初始值),字段被删除将不设置。这就是serialVersionUID的作用。

序列化

对象的序列化是指将对象转换成字节序列的过程。

对象的反序列化是指字节序列转换成对象的过程。

在Java网络编程编程中,进程间可以发送各种类型的数据,但无论是那种类型的数据,在网络中传输都要以二进制序列的形式,所以发送方需要把Java对象转换成字节序列;接收方则需要把字节序列转化成Java对象。这个过程中,Java对象转化成字节序列的过程称作为对象的序列化,把字节码恢复成Java对象的过程称作为Java对象的反序列化。

对象序列化主要有两种用途:
  1)实现对象在网络传输。
  2)实现对象的持久化,例如:存放到文件,DB中。

java.io.ObjectOutputStream是Java中的对象输出流,writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。java.io.ObjectInputStream是Java中的对象输入流,readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

分享到:
评论

相关推荐

    序列化版本号serialVersionUID的作用_动力节点Java学院整理

    序列化版本号serialVersionUID的作用_动力节点Java学院整理.

    java序列化和serialVersionUID的使用方法实例

    主要介绍了java序列化和serialVersionUID的使用方法实例的相关资料,这里说明很详细的使用方法让你彻底学会,需要的朋友可以参考下

    java序列化实现演示

    Java序列化机制(2)- serialVersionUID 实验 http://blog.csdn.net/suileisl/article/details/16991753

    什么是Java的序列化和反序列化?如何实现对象的序列化和反序列化?(java面试题附答案).txt

    通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...

    3分钟读阿里Java手册: 序列化

    前言 下面这句代码,相信大家可能跟我一样都非常熟悉,但是真正了解的人又有多少呢? private static final long serialVersionUID = 1L;...Java序列化保留了对象类的元数据(类、继承类等),以及对象数据,兼容性好

    序列化和反序列化1

    序列化ID 两个类的序列化ID相同才能保证反序列的对象是一致private static final long serialVersionUID在序列化过程中,

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

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

    从根上读懂阿里手册 | 为啥不能轻易修改serialVersionUID字段

    阿里巴巴开发手册,(四)OOP 规约,第 13 条解释如下: 【强制】序列化类新增属性时,请...首先我们需要了解一下序列化,我们可以简单了理解序列化就是把 Java 对象转换成另一种形态的数据,这种形态的数据可以用于

    Stephenerialization:Java 跨版本序列化问题的解决方案。-开源

    当尝试在不同版本的类之间进行序列化时,Java 的内置序列化不足。 使用静态 serialVersionUID 是一个好的开始,但还不够。 如果您想要解决 Java 序列化问题,那就别无所求! Stephenerialization 使您可以轻松地在...

    Java关键字—-transient

    本篇文章序列化、反序列化用的类是同一个类,可以通过注释main中1然后修改Stu类实现有无transient关键字修饰、serialVersionUID是否不同,得到以下结果: 1、serialVersionUID的数值大小不会影响序列化后的字节数...

    java8集合源码-Java:Java

    Java中序列化和反序列化的区别。 什么是SerialVersionUID? 内部类和子类的区别。 JSON 相对于 XML 的优势是什么? 我们可以两次导入相同的包/类吗? JVM 会在运行时加载包两次吗? 静态加载和动态类加载的区别? ...

    Serializable-master.zip

    1.serialVersionUID-->适用于Java的序列化机制: 2.具体化序列化过程: 3.serialVersionUID有两种显示的生成方式:

    java-lt:关于flink的一些测试

    idea 设置 java 类无序列化 id 警告 File--> Settings--> Editor--> Inspections--> Java--> Serialization issues--> 将 Serializable class without serialVersionUID 勾选 idea jihuoma #ssh ...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    D .POJO类的serialVersionUID不一致会抛出序列化运行时异常。 多选 9.关于Java的接口描述,下列哪些说法符合《阿里巴巴Java开发手册》:BCD A .在接口类中的方法和属性使用public修饰符。 B .对于Service类,...

    memcached1

    对基本的数据我们可以操作,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口,因为memcached是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须...

    SerialVer task for ANT-开源

    SerialVer将Java serialver功能添加到Apache-Jakarta的ANT工具中。 该项目在可序列化类的源代码中添加了Tasks和FilterReaders来获取,插入和修改serialVersionUID。

    @SuppressWarnings

    serial 当在可序列化的类上缺少 serialVersionUID 定义时的警告。 finally 任何 finally 子句不能正常完成时的警告。 all 关于以上所有情况的警告。 @SuppressWarnings 批注允许您选择性地取消特定代码段(即,类或...

    基于Spring的HttpInvoker实现改写egova_invoker.zip

    ProxyFactory.proxy 方法,生成接口的代理对象,直接调用方法客户端和服务器端的接口和实体类要一致,实体类必须是可以序列化的比如:定义Bean: public class DemoBean implements java.io.Serializable{ ...

Global site tag (gtag.js) - Google Analytics