码迷,mamicode.com
首页 > 编程语言 > 详细

Java中的序列化与反序列化的基础介绍

时间:2020-09-04 17:12:19      阅读:43      评论:0      收藏:0      [点我收藏+]

标签:extend   一个   stream   解决方案   方法   ansi   puts   释放   idc   

1-1.序列化和反序列化的概述

把对象以流的方式写入到文件中保存叫写对象,也叫对象的序列化
对象中包含的不仅仅是字符,所以使用字节流
ObjectOutputStream:对象的序列化流
把文件中保存的对象,以流的方式读取出来,叫做读对象,也叫对象的反序列化
读取的文件保存的都是字节,使用字节流
ObjectInputStream:对象的反序列化流

1-2.对象的序列化流

java.io.ObjectOutputStream extends OutputStream
ObjectOutputStream:对象的序列化流
作用:把对象以流的方式写入到文件中保存
构造方法:
ObjectOutputStream(OutputStream out)创建写入指定OutputStream的ObjectOutputStream。
参数:
OutputStream out:字节输出流
特有的成员方法:
void writeObject(Object obj)将指定的对象写入ObjectOutputStream。

使用步骤:
1).创建ObjectOutputStream对象,构造方法中传递字节输出流
2).使用ObjectOutputStream对象中的方法wvriteObject,把对象写入到文件中
3).释放资源

序列化和反序列化的时候,会抛出NotSerializableException没有序列化异常

类通过实现java.io.Serializable接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,就会抛出上述异常。
Serializable接口也叫标记型接口
要进行序列化和反序列化的类必须实现Serializable接口,就会给类添加一个标记
当我们进行序列化和反序列化的时候,就会检测类上是否有这个标记
有:就可以序列化和反序列化
没有:就会抛出NotSerializableException异常

1-3.对象的反序列化流

java.io.ObjectInputStream extends InputStream
ObjectInputStream:对象的反序列化流
作用:把文件中保存的对象,以流的方式读取出来使用
构造方法:
ObjectInputStream(InputStream in)创建从指定InputStream读取的ObjectInputStream。
参数:
InputStream in:字节输入流
特有的成员方法:
Object readObject()从ObjectInputStream读取对象。

1-4.transient关键字:瞬态关键字

static关键字:静态关键字
静态优先于非静态加载到内存中(静态优先于对象进入到内存中)
被static修饰的成员变量不能被序列化的,序列化的都是对象
transient关键字:瞬态关键字
被transient修饰成员变量,不能被序列化,但不会影响其他的操作。

1-5.序列化冲突异常:InvalidClassException

以Perspn类为例,编译器(javac.exe)会把"Person.java"文件编译生成"Person.class"文件
Person类实现了Serializable接口,就会根据类的定义
给Person.class文件,添加一个序列号

反序列化的时候,会使用Person.class文件中的序列号
和Person.txt文件中的序列化号比较
如果是—样的,则反序列化成功
如果不—样,则抛出序列化冲突异常:InvalidClassException

若是在运行过一次之后修改了类的定义那么就会给Person.class文件重新编译生成—个新的序列号

此时再与之前的那个序列号比较就会反序列化失败。

即,就会产生这样一个问题:
每次修改类的定义,都会给class文件生成—个新的序列号
我们可以针对这个问题采用这样的解决方案:
无论是否对类的定义进行修改,都不重新生成新的序列号
可以直接手动给类添加一个序列号
格式在Serializable接口规定:
可序列化类可以通过声明名为"serialVersionUID”的字段(该字段必须是静态(static)、最
终(final)的long型字段)显式声明其自己的serialVersionUID:
static final long serialVersionUID = 42L:这样,序列号就是一个常量,不能改变了。

 

Java中的序列化与反序列化的基础介绍

标签:extend   一个   stream   解决方案   方法   ansi   puts   释放   idc   

原文地址:https://www.cnblogs.com/9-King/p/13568443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!