有序列化,就必然有反序列化!比如在A端为UserLogin(见上一篇对象序列化)做了序列化,然后在B端进行反序列化。

首先需要,A端和B端都定义有相同的UserLogin类。可是,万一两端的UserLogin定义不一致呢?这就需要serialVersionUID

简单来说,serialVersion类似于软件的版本号,如果软件的发布以对应的版本号作为标识。那么serialVersionUID就是对当前序列化类做出的标识。

一般情况下,A端在做序列化时,也会将对应的serialVersionUID存储在文件中,在B端进行反序列化时,首先将文件中的serialVersionUID与B端UserLogin类的serialVersionUID做比较,如果一致,则进行反序列化操作,否则,反序列化操作失败。

一、serialVersionUID定义的方式

serialVersionUID有两种生成方式:

(1)直接显式指定

1 private static final  long   serialVersionUID = 1L;

(2)自动生成

若类中没有显式指定serialVersionUID,则程序会根据类名、接口名、属性和方法自动生成一个。

二、序列化的使用

在A端为UserLogin(见上一篇对象序列化)做了序列化;那么在B端也创建一个相同的UserLogin类;

(1)序列化实体类

 1 package com.sf.code.serial;
 2
 3 import java.io.Serializable;
 4
 5 public class Person implements Serializable {
 6     private static final long serialVersionUID = 123456789L;
 7     public int id;
 8     public String name;
 9
10     public Person(int id, String name) {
11         this.id = id;
12         this.name = name;
13     }
14
15     public String toString() {
16         return "Person: " + id + " " + name;
17     }
18 }

(2)A端做对象序列化

 1 package com.sf.code.serial;
 2
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectOutputStream;
 6
 7 public class SerialTest {
 8
 9     public static void main(String[] args) throws IOException {
10         Person person = new Person(1234, "wang");
11         System.out.println("Person Serial" + person);
12         FileOutputStream fos = new FileOutputStream("Person.txt");
13         ObjectOutputStream oos = new ObjectOutputStream(fos);
14         oos.writeObject(person);
15         oos.flush();
16         oos.close();
17     }
18 }

(3)B端做反序列化

 1 package com.sf.code.serial;
 2
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6
 7 public class DeserialTest {
 8     public static void main(String[] args) throws IOException, ClassNotFoundException {
 9         Person person;
10
11         FileInputStream fis = new FileInputStream("Person.txt");
12         ObjectInputStream ois = new ObjectInputStream(fis);
13         person = (Person) ois.readObject();
14         ois.close();
15         System.out.println("Person Deserial" + person);
16     }
17 }

三、使用规则

(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端被初始化为默认值。

转载于:https://www.cnblogs.com/yy20141204bb/p/10571144.html

Serializable中的serialVersionUID相关推荐

  1. 为什么要在Java的Serializable类中使用SerialVersionUID

    序列化和SerialVersionUID始终是许多Java开发人员的难题. 我经常会看到类似此SerialVersionUID的问题,或者如果不在我的Serializable类中声明SerialVer ...

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

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

  3. java 中的 serialVersionUID

    2019独角兽企业重金招聘Python工程师标准>>> private static final long serialVersionUID = 1L; Java的序列化机制是通过判 ...

  4. Java序列化中的SerialVersionUid

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

  5. 深入理解Java序列化中的SerialVersionUid

    作者:fbysss msn:jameslastchina@hotmail.com  blog:blog.csdn.net/fbysss 声明:本文由fbysss原创,转载请注明出处 关键字:Seria ...

  6. Idea中类实现Serializable接口 引入 serialVersionUID

    idea实现Serializable接口,然后打出serialVersionUID的办法 setting>editor>Inspection>Java>Serializatio ...

  7. Serializable接口中serialVersionUID字段的作用

    序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类. 如果接收者加 ...

  8. 几种Java常用序列化框架的选型与对比

    简介: 序列化与反序列化是我们日常数据持久化和网络传输中经常使用的技术,但是目前各种序列化框架让人眼花缭乱,不清楚什么场景到底采用哪种序列化框架.本文会将业界开源的序列化框架进行对比测试,分别从通用性 ...

  9. Serializable序列化中serialVersionUId的作用

    Serializable是java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作,使用Serializable来实现序列化很简单,只要在类的声明中指定一个类似下面的标识即 ...

最新文章

  1. LeeCode-Majority Element
  2. 四年后十大最赚钱行业
  3. android evaluater_android通过WebView的evaluateJavascript()调用JS
  4. 三十七、深入Vue.js组件Component(下篇)
  5. 数塔(hdoj 2084,动态规划递推)
  6. jaxb int convert to integer
  7. LinuxMySQL主从配置
  8. 让想法更加结构化!思维导图工具MindManager
  9. ureport2 mysql_Ureport2 安装,配置及问题详解
  10. 4mysql_12-4mysql 查询
  11. JAVA就诊叫号_基于B/S的JAVA门诊就诊系统
  12. selenuim webDriver API 16种定位方式
  13. 【算法笔记+HDU2222】AC自动机(统计一个长字符串由多少个不同的短字符串组成)
  14. CSDN使用MD编辑器写博客如何让图片居中(调整图片位置大小)MD编辑器学习笔记
  15. 六度分离_hdu_1869(floyd算法).java
  16. 張學友 - Private Corner 新专辑1.29
  17. 工业控制系统基础知识入门(一)
  18. 常用Alink协议总结
  19. word2vec加载异常解决:UnicodeDecodeError: ‘utf-8‘ codec can‘t decode bytes in position。。。
  20. 湘大学生住宿物业管理情况调查(转自《文心报》)

热门文章

  1. vb html table,VB6.0 如何是用 datatable
  2. ​给前端开发者的 14 个 JavaScript 代码优化建议
  3. 前后端分离后的前端时代,使用前端技术能做哪些事?
  4. 【干货】写给初中级前端的高级进阶指南
  5. Modifier ‘public‘ is redundant for interface methods错误
  6. ajax实现环境,基于jQuery实现的Ajax(Django环境)
  7. cp oracle,Oracle ASM使用asmcmd中的cp命令来执行远程复制
  8. css设置按钮竖直方向居中_前端设计师必须知道的10个重要的CSS技巧
  9. 引发了未经处理的异常:读取访问权限冲突_从零开始学Python:23课-文件读写和异常处理
  10. 为什么要写this在访问成员变量的时候_终于知道阿里字节这样的公司,为什么经常拿final来考验求职者了...