Serializable 接口与 Java 序列化与反序列化
0. 序列化的意义
从内存到本地即为本地化或者在网络中进行传输,或叫序列化,持久化。
某 Java 类实现 Serializable 接口的目的是为了可持久化(简单理解为本地化),比如网络传输或本地存储,为系统的分布式运行和异构部署提供先决支持条件。若没有序列化,我们熟悉的远程调用(RPC,无法读取远程主机内存中的任何目标,必须首选在远程将目标序列化),对象数据库都不可能存在。
1. 一个简单 demo
Serializable 为空接口,只是为了起到标识说明之义。
Person 类实现 Serializable 接口,这是一个简单的 JavaBean,实现了 Serializable 接口,可以在网络上传输,也可以本地存储然后读取。我们可以通过 Java 消息服务(Java Message Service)方式传递该对象(即通过网络传递一个对象),定义在消息队列中的数据类型为 ObjectMessage。
public class Person implements Serializable {
private String name; // 省略 getter、setter
}序列化及反序列化客户端代码:
public class Producer
{
final static String FILE_NAME = "C:/obj.bin";
public static void main(String[] args)
{
Person person = new Person();
person.setName("");
SerializationUtils.writeObject(person, FILE_NAME);
}
}
public class Conducer
{
final static String FILE_NAME = "C:/obj.bin";
public static void main(String[] args)
{
Person p = (Person)SerializationUtils.readObject(FILE_NAME);
p.getName();
}
}其中的 SerializationUtils 工具类如下:
public class SerializationUtils
{
// 序列化
public static void writeObject(Serializable s, String filename)
{
try
{
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream(filename));
oos.writeObject(s);
oos.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
// 反序列化
public static Object readObject(String filename)
{
Object obj = null;
try
{
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream(filename));
ois.readObject();
ois.close();
} catch (Exception e)
{
e.printStackTrace();
}
return obj;
}
}
2. UID 的必要性
正因为分布和异构,无论是读取本地文件还是远程调用,本地是无法在编译期获取待获取的类的完整信息的(成员变量和函数)。也即有可能发生,消息的生产者和消息的消费者所参考的类(Person)有差异,比如消息生产者的 Person 类添加一个年龄字段,而相应的消费者没有增加该属性。
这种序列化和反序列化的类不一致的情形下,反序列时有可能会报一个 InvalidClassException 异常。原因就在于序列化和反序列化所对应的类版本发生了变化,JVM 不能把数据流转换为实例对象。那么,JVM 是根据什么来判断一个类版本的呢?
通过 SerialVersionUID,也叫流标志符(Stream Unique Identifier)。
public class Person implements Serializable {
    private static final long serialVersionUID = 55799L;
}
此时如果发生如下形式的不一致的情况,生产者增加年龄属性,消费端 Person 还保持以前的版本。此时,虽然物理上,生产者和消费者对应的类版本不同,但是显式声明的 serialVersionUID 相同,反序列化也可以运行,所带来的业务问题即是消费端无法读取新增的业务属性。
Serializable 接口与 Java 序列化与反序列化的更多相关文章
- Java 序列化和反序列化(三)Serializable 源码分析 - 2
		
目录 Java 序列化和反序列化(三)Serializable 源码分析 - 2 1. ObjectStreamField 1.1 数据结构 1.2 构造函数 2. ObjectStreamClass ...
 - Java 序列化和反序列化(二)Serializable 源码分析 - 1
		
目录 Java 序列化和反序列化(二)Serializable 源码分析 - 1 1. Java 序列化接口 2. ObjectOutputStream 源码分析 2.1 ObjectOutputSt ...
 - Java 序列化和反序列化(一)Serializable 使用场景
		
目录 Java 序列化和反序列化(一)Serializable 使用场景 1. 最简单的使用:Serializable 接口 2. 序列化 ID 的问题 3. 静态字段不会序列化 4. 屏蔽字段:tr ...
 - Serializable详解(1):代码验证Java序列化与反序列化
		
说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...
 - Java序列化与反序列化(Serializable)
		
Java序列化与反序列化(Serializable) 特别注意: 1.要序列化的类必须实现Serializable借口 2.在反序列化(读取对象)的时候必须额外捕获EOFException 3.序列化 ...
 - Java序列化与反序列化
		
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...
 - [转] Java序列化与反序列化
		
原文地址:http://blog.csdn.net/wangloveall/article/details/7992448 Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java ...
 - java基础知识回顾之javaIO类--java序列化和反序列化
		
/** * * 一:理解序列化反序列化及其应用 * 序列化:把堆内存的对象转化成字节流的过程. * 反序列化:把字节流序列恢复重构成对象的过程. * 对象的序列化的用途:1.把对象的字节序列持久化, ...
 - Java基础(五)-Java序列化与反序列化
		
.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...
 
随机推荐
- 线性回归Linear regression
			
线性回归算法 解决回归问题 思想简单,容易实现 是许多强大的非线性模型的基础 结果具有很好的可解释性 蕴含机器学习中的很多重要思想 基本思想:寻找一条直线,最大程度的“拟合”样本特征和样本输出标记之间 ...
 - [Kubernetes]kubectl命令补全出错
			
在kubernetes集群中,命令补全能够省很多事,但是这两天就很奇怪 kubectl get pod -n kube+tab键自动补全Namespace的时候出现错误 kubectl get pod ...
 - [NOIP2003] 提高组 洛谷P1041 传染病控制
			
题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...
 - OC温习一:基本数据类型
			
类型限定修饰词 除了上图中基本数据类型之外, 还有一些类型限定修饰词: short短型:修饰 int double: long长型:修饰 int double: signed 有符号型:修饰int ...
 - HDU——2768  Cat vs. Dog
			
Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
 - [Bzoj3611][Heoi2014]大工程(虚树)
			
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2000 Solved: 837[Submit][Status ...
 - codeforces 875F(基环外向树)
			
题意 有一个左边m个点,右边n个点的二分图(n,m<=1e5),左边每个点向右边恰好连两条权值相同的边. 求这个二分图的最优匹配 分析 对于这种二选一问题,即左边的a连向右边的b和c,权值为d, ...
 - HDOJ 5416 CRB and Tree DFS
			
CRB and Tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tot ...
 - [Bash] Find Files and Folders with `find` in Bash
			
find is a powerful tool that can not only find files but it can run a command on each matching file ...
 - Spring之IOC篇章具体解释
			
专题一 IOC 1.接口以及面向接口编程 a.结构设计中,分清层次以及调用关系,每层仅仅向外(或者上层)提供一组功能接口,各层间仅依赖接口而非实现类这样做的优点是,接口实现的变动不影响各层间的调用 ...