Serializable中的serialVersionUID
有序列化,就必然有反序列化!比如在A端为UserLogin(见上一篇对象序列化)做了序列化,然后在B端进行反序列化。
首先需要,A端和B端都定义有相同的UserLogin类。可是,万一两端的UserLogin定义不一致呢?这就需要serialVersionUID。
简单来说,serialVersion类似于软件的版本号,如果软件的发布以对应的版本号作为标识。那么serialVersionUID就是对当前序列化类做出的标识。
一般情况下,A端在做序列化时,也会将对应的serialVersionUID存储在文件中,在B端进行反序列化时,首先将文件中的serialVersionUID与B端UserLogin类的serialVersionUID做比较,如果一致,则进行反序列化操作,否则,反序列化操作失败。
一、serialVersionUID定义的方式
serialVersionUID有两种生成方式:
(1)直接显式指定
private static final long serialVersionUID = 1L;
(2)自动生成
若类中没有显式指定serialVersionUID,则程序会根据类名、接口名、属性和方法自动生成一个。
二、序列化的使用
在A端为UserLogin(见上一篇对象序列化)做了序列化;那么在B端也创建一个相同的UserLogin类;
(1)序列化实体类
package com.sf.code.serial; import java.io.Serializable; public class Person implements Serializable {
private static final long serialVersionUID = 123456789L;
public int id;
public String name; public Person(int id, String name) {
this.id = id;
this.name = name;
} public String toString() {
return "Person: " + id + " " + name;
}
}
(2)A端做对象序列化
package com.sf.code.serial; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; public class SerialTest { public static void main(String[] args) throws IOException {
Person person = new Person(, "wang");
System.out.println("Person Serial" + person);
FileOutputStream fos = new FileOutputStream("Person.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(person);
oos.flush();
oos.close();
}
}
(3)B端做反序列化
package com.sf.code.serial; import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; public class DeserialTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person; FileInputStream fis = new FileInputStream("Person.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
person = (Person) ois.readObject();
ois.close();
System.out.println("Person Deserial" + person);
}
}
三、使用规则
(1)假设A端和B端的serialVersionUID一致,A端不变,B端增加一个字段:
执行序列化、反序列化操作正常,B端新增字段的属性值被初始化为默认值。
(2)假设A端和B端的serialVersionUID一致,A端不变,B端减少一个字段:
执行序列化、反序列化操作正常,B端减少的字段被忽略,其它字段正常。
(3)假设A端和B端的serialVersionUID一致,A端增加一个字段,B端不变:
执行序列化、反序列化操作正常,A端新增字段被B端忽略。
(4)假设A端和B端的serialVersionUID一致,A端减少一个字段,B端不变:
执行序列化、反序列化操作正常,A减少字段在B端被初始化为默认值。
Serializable中的serialVersionUID的更多相关文章
- Serializable中的serialVersionUID到底有啥用
最近在研究跨进程通信的问题,于是又再一次研究了,我们熟悉而又陌生的Serializable接口. 那么好,做过Java开发的朋友肯定对这个接口不陌生吧,Java中就是通过这个接口,来实现了序列化和反序 ...
- Serializable中的serialVersionUID是必须的吗
不写serialVersionUID就没有吗 即使不写, jdk反序列化时也会自动检查这个id, 反编译.class文件你也看不到这个值 rpc反序列化 如果使用jdk的方式, 这个必须配置 如果使用 ...
- Android Studio类中实现Serializable自动生成serialVersionUID
1.File -> Settings... -> Editor -> Inspections -> Serialization issues -> Serializabl ...
- Java中的SerialVersionUID
Java中的SerialVersionUID 序列化及SergalVersionUID困扰着许多Java开发人员.我经常会看到这样的问题,什么是SerialVersionUID,如果实现了Serial ...
- java.io.Serializable中serialVersionUID的作用
把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网 ...
- serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法
ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...
- Java序列化中的SerialVersionUid
版权声明:本文为博主fbysss原创文章,转载请注明出处 作者:fbysssmsn:jameslastchina@hotmail.com blog:blog.csdn.NET/fbysss声明:本文 ...
- Java序列化中的serialVersionUID有什么用?
如果一个实现了Serializable的类没有serialVersionUID属性,IDE(比如Eclipse)通常会报这样一个warning: The serializable class Foo ...
- java序列化和反序列化中的serialVersionUID有啥用
1.什么是序列化和反序列化 序列化就是将java对象转成字节序列的过程:反序列化就是将字节序列转成java对象的过程. java中,序列化的目的一种是需要将对象保存到硬盘上,一种是对象需要在网络中传 ...
随机推荐
- Python 在cmd中import模块成功,但是在jupyter notebook中No module xxx found
由于需要用到python中的某个库,因此打开命令行窗口cmd,然后使用pip安装.安装成功后,在cmd中输入python调出python环境,import该模块并使用,可以正常使用.但是打开juypt ...
- jQuery插件开发的五种形态小结(转)
关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...
- 输入正整数n,求各位数字和
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/5 10:24 * @description ...
- CentOS启动docker1.13失败(Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.)
一.启动失败 1.启动docker [root@localhost ~]# systemctl start docker Job for docker.service failed because t ...
- Lombok 介绍
Lombok使用 介绍 在项目中使用Lombok可以减少很多重复代码的书写.比如说getter/setter/toString等方法的编写. IDEA中的安装 打开IDEA的Setting –> ...
- C# 数字字符串前面不足位补零方法
; Console.WriteLine(i.ToString("D3")); Console.WriteLine(i.ToString(")); Console.Writ ...
- 深入理解iostat
前言 iostat算是比较重要的查看块设备运行状态的工具,相信大多数使用Linux的同学都用过这个工具,或者听说过这个工具.但是对于这个工具,引起的误解也是最多的,大多数人对这个工具处于朦朦胧胧的状态 ...
- mac下git安装与使用
1.下载git客户端,下载地址为:https://git-scm.com/download/mac 2.打开安装包,可以看到此时的界面为: 我们需要把.pkg的安装包安装到系统当中.我双击了安装包 ...
- centos7内核升级及curl访问https证书过期处理
centos7内核升级及curl访问https证书过期处理 先看下当前系统的linux内核版本 uname -r 3.10.0-229.el7.x86_64 升级步骤 1.rpm --import h ...
- 2.Hadoop平台架构准备工作
1. 需要的软件:centos.hadoop.jdk.winscp. 2.搭建开发环境 Vmware安装 3.安装Linux操作系统 (1).安装虚拟机1,设置相关的参数: 4.点击设置,常规-> ...