有序列化,就必然有反序列化!比如在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的更多相关文章

  1. Serializable中的serialVersionUID到底有啥用

    最近在研究跨进程通信的问题,于是又再一次研究了,我们熟悉而又陌生的Serializable接口. 那么好,做过Java开发的朋友肯定对这个接口不陌生吧,Java中就是通过这个接口,来实现了序列化和反序 ...

  2. Serializable中的serialVersionUID是必须的吗

    不写serialVersionUID就没有吗 即使不写, jdk反序列化时也会自动检查这个id, 反编译.class文件你也看不到这个值 rpc反序列化 如果使用jdk的方式, 这个必须配置 如果使用 ...

  3. Android Studio类中实现Serializable自动生成serialVersionUID

    1.File -> Settings... -> Editor -> Inspections -> Serialization issues -> Serializabl ...

  4. Java中的SerialVersionUID

    Java中的SerialVersionUID 序列化及SergalVersionUID困扰着许多Java开发人员.我经常会看到这样的问题,什么是SerialVersionUID,如果实现了Serial ...

  5. java.io.Serializable中serialVersionUID的作用

    把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网 ...

  6. serialVersionUID, ObjectInputStream与ObjectOutputStream类,Serializable接口,serialVersionUID的作用和用法

    ObjectInputStream与ObjectOutputStream类所读写的对象必须实现Serializable接口,对象中的transient和static类型成员变量不会被读取和写入 Ser ...

  7. Java序列化中的SerialVersionUid

    版权声明:本文为博主fbysss原创文章,转载请注明出处 作者:fbysssmsn:jameslastchina@hotmail.com  blog:blog.csdn.NET/fbysss声明:本文 ...

  8. Java序列化中的serialVersionUID有什么用?

    如果一个实现了Serializable的类没有serialVersionUID属性,IDE(比如Eclipse)通常会报这样一个warning: The serializable class Foo ...

  9. java序列化和反序列化中的serialVersionUID有啥用

     1.什么是序列化和反序列化 序列化就是将java对象转成字节序列的过程:反序列化就是将字节序列转成java对象的过程. java中,序列化的目的一种是需要将对象保存到硬盘上,一种是对象需要在网络中传 ...

随机推荐

  1. maven和glassfish安装和部署及hello1和hello2的部署

    1.安装maven和glassfish及配置环境变 首先搜索并下载maven3.6.0和glassfish4.1.1(版本看按需要选择). 点击安装包进行安装 安装完成后开始配置环境变量 打开系统环境 ...

  2. python全栈开发 * 继承性 层叠性 盒模型 标准文档流 * 180809

    ---恢复内容开始--- 一继承性 1.继承: 给父级设置一些属性,子级继承了父级的该属性,这就是我们的css中的继承. 2. 可继承: color . font-*(size). text-*(de ...

  3. static_cast 使用

    static_cast 用于基本类型转换,入int转double: int distanceThreshold  = 4: double val = static_cast<qreal>( ...

  4. react将字符串转义成html语句

    在使用reactjs库的时候,会遇到将一段html的字符串,然后要将它插入页面中以html的形式展现,然而直接插入的话页面显示的就是这段字符串,而不会进行转义,可以用以下方法插入,便可以html的形式 ...

  5. Windows10 ntoskrnl.exe占用大量的磁盘空间(100%)

    一.解决办法: 1.此电脑(右键)>  管理(点击)> 系统工具 > 任务计划程序 > 任务计划程序库 > Microsoft > windows > .NE ...

  6. PySe-007-解决“Chrome正在受到自动软件的控制”

    python使用selenium启动chrome的代码如下所示: #!/usr/local/bin/python # -*- coding: utf-8 -*- from selenium impor ...

  7. 兼容在安装linux系统过程中不支持非原装的光模块的命令

    1 .通过ifconfig -a发现有网卡找不到,并且配置没有问题,那么很可能是光模块有问题2 .dmesg | grep 82599EB ,通过这个命令过滤发现有如下信息: [ 7142.12197 ...

  8. C++ opencv调用resize修改插值方式遇到的坑

    opencv提供的热死则函数原型如下:void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0 ...

  9. 初识springboot

    一.springboot简介: 1.简化spring应用开发框架 2.把spring所有技术整合在了一起 3.J2EE开发的一站式解决方案 我曾经学习springMVC时候,那许许多多的配置文件的配置 ...

  10. AIX7.1环境打补丁缺少bash OPATCHAUTO-72049

    DB:12.1.0.2.0 RAC OS:AIX 7.1 [To patch only the GI home] su - root export UNZIPPED_PATCH_LOCATION=/o ...