Java 序列化

参考链接:
Java对象的序列化和反序列化
Java transient关键字使用小记

1. Java序列化概念

把对象转换为字节序列的过程称为对象的序列化;
把字节序列恢复为对象的过程称为对象的反序列化;
作用:对象作为字节序列永久存储在文件中;网络上传输对象的字节序列。

2. JDK中的序列化API

java.io.ObjectOutputStream 表示对象输出流,它的wrteObject(Object
obj)方法可将obj对象进行序列化,把得到的字节序列写入目标输出流中。
java.io.ObjectInputStream 表示对象输入流,它的readObject ()方法从一个源输入流中读取字节序列,再把它们反序列化成一个对象返回。
只有实现了Serializable或是Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

3. serialVersionUID的作用

s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ ​字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。
Java
//默认生成值
private static final long serialVersionUID = 1L;
//根据类名,接口,变量,方法等信息生成的值
private static final long serialVersionUID = 4603642343377807741L;


*作用:*如果我们有需求要在序列化后添加一个字段或者方法。可以自己去指定serialVersionUID。只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。

## 4. transient关键字
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
第三点可能有些人很迷惑,因为反序列化后static的值也能够被读出。实际上是这样的:反序列化后类中static型变量username的值为当前JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件。那你最好再阅读该篇文章,文章对序列化...
    jiangmo阅读 3,443评论 0 2
  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 13,742评论 0 24
  • 声明:原创文章,转载请注明出处。//www.greatytc.com/u/e02df63eaa87 1、序...
    唐影若凡阅读 3,255评论 0 0
  • 哈哈哈哈哈哈,好开心,高中的革命战友又要跟我站在同一战线了,只不过,她比我晚一年。今天是她生日,也是高考第一天~ ...
    只有吃才开心阅读 1,176评论 0 0
  • 何谓数据产品 不知道这是不是印证了若不是找工作也不会跟数据产品结梁子呢,呵呵!言归正传,数据产品这个词目前看起来还...
    会飞的虾仁阅读 5,645评论 0 23