Java 对象实现 Serializable 的原因
java.io.Serializable 是 Java 中的一种标记接口(marker interface)。标记接口是一种特殊的接口,java.io.Serializable 接口没有任何方法,也没有常量。
对象序列化是将对象转换为静态有序的字节流的过程,因此该对象可以用于传输或持久化。反序列化是该过程的反向操作,即将字节流转换为 Java 对象。Java 对象实现 java.io.Serializable 该接口后,就能实现序列化和反序列化。序列化在远程调用中非常常见。
暴露实体
定义 member 实体如下:
@Data
public class Mbr implements java.io.Serializable {
private Long id;
private String name;
private String age;
}
我们在实践中,可能会遇到不定义 dto 对象,直接在接口中暴露实体对象 create(Mbr mbr),update(Mbr mbr) 的情况,这时实体对象必须实现 java.io.Serializable 接口。
当实体实现了 java.io.Serializable 接口后,所有继承它的实体也能被序列化。如果实体里引用了其它对象,那么被引用的对象也应该可以序列化。
@Data
public class Mbr implements java.io.Serializable {
private Long id;
private String name;
private String age;
// Address 应该也实现 java.io.Serializable 接口
private Address address;
}
serialVersionUID
@Data
public class Mbr implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String age;
}
JVM 通过版本号(serialVersionUID) 将序列化的实体联系起来。在反序列化的过程中,JVM 会将字节流中的 serialVersionUID 与本地响应的实体类中的 serialVersionUID 比较,相同,可以序列化,否则抛出 InvaidCastException。
当实体中不定义 serialVersionUID 字段时,JVM 将在运行时生成该字段。所以,这里的重点是,在开发过程中经常会变更字段,如果不定义 serialVersionUID 字段,运行时每次都会生成不同的 serialVersionUID,导致 _InvalidClassExceptions_ 异常。
这种问题还是挺常见的,在微服务 A 中引用另一个微服务 B 的实体(或 dto)包,B 中的实体更新,但没有更新 A 中的应用,就会引发此问题。
Java 对象实现 Serializable 的原因的更多相关文章
- JAVA 对象序列化——Serializable
1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object st ...
- JAVA 对象序列化——Serializable(转)
文章出自:http://www.cnblogs.com/chenfei0801/archive/2013/04/05/3001149.html Java的对象序列化是指将那些实现了Serializab ...
- Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
Java对象克隆(Clone)及Cloneable接口.Serializable接口的深入探讨 Part I 没啥好说的,直接开始Part II吧. Part II 谈到了对象的克隆,就不得不说为什么 ...
- Java对象为啥要实现Serializable接口
Serializable接口概述 Serializable是java.io包中定义的.用于实现Java类的序列化操作而提供的一个语义级别的接口.Serializable序列化接口没有任何方法或者字段, ...
- 理解Java对象序列化
http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...
- Java对象表示方式1:序列化、反序列化和transient关键字的作用
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态.一 ...
- Java 对象的串行化(Serialization)
1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(pe ...
- java对象的序列化与反序列化使用
1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进 ...
- Java对象的序列化与反序列化
序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...
随机推荐
- 论Hello World 有多少种输出方法:
论Hello World 有多少种输出方法: C: printf("Hello Word!"); C++: cout<<"Hello Word!"; ...
- 如何用vue打造一个移动端音乐播放器
写在前面 没错,这就是慕课网上的那个vue音乐播放器,后台是某音乐播放器的线上接口扒取,虽然这类项目写的人很多,但不得不说这还是个少有的适合vue提升的好项目,做这个项目除了想写一个比较大并且功能复杂 ...
- Go 里面的 ^ 和 &^
这几天在研究 Go 的源码,突然发现了一个之前没有见过的位运算,见这里 new &^= mutexWoken & 和 ^,分别表示 AND 和 XOR,这个不用多说. 值得一提的是 ^ ...
- Android M 版本以后的特殊权限问题分析
现象 桌面悬浮框在6.0以后,会因为SYSTEM_ALERT_WINDOW权限的问题,无法在最上层显示. 问题原因 SYSTEM_ALERT_WINDOW,设置悬浮窗,进行一些黑科技 WRITE_SE ...
- Android开发 之 理解Handler、Looper、MessageQueue、Thread关系
本文转自博客:http://blog.csdn.net/he90227/article/details/43567073 一. 图解与概述 首先Android中 的每一个线程都会对应一个Message ...
- datetimepicker 设置日期格式、初始化
$('#datetimepicker').datetimepicker({ minView: "month", //选择日期后,不会再跳转去选择时分秒 language: 'zh- ...
- 利用Docker快速部署Mysql
写在前面 我又来更新了~~~,今天内容较少,主要是利用Docker快速部署Mysql和初始化数据 利用Docker下载Mysql 简洁明了,在命令提示符中输入 docker pull mysql:8. ...
- python基本数据类型介绍
数据类型 首先知道什么是数据类型 针对不同的数据类型采用不同的处理方法 --目录-- 一.数据类型之整型 二.数据类型之浮点型 三.数据类型之字串符 四.数据之列表 一.数据类型之整型 1.其实呢就是 ...
- C语言求最大公约数最小公倍数(多种方法)
前言 这个求解方式多样化,灵活变动,但是,网上没有很好的资源和很全的代码,特此练习,敲打后,总结成本片文章. 单一求解 一.最大公约数 1.穷举法(最简单求解方式) 利用除法方式用当前的数字不断去除以 ...
- java过滤器拦截器的执行时机
https://www.cnblogs.com/shamo89/p/8534580.html https://www.cnblogs.com/juanzila/p/11276067.html