1.序列化的文件

序列化的文件一般难以阅读,但是相对于纯文本文件更容易让程序恢复状态,并且比较安全。

2.序列化的过程:

//1.创建出FileOutputStream
FileOutputStream fileStream = new FileOutputStream("文件名.ser");
//2.创建出ObjectOutputStream
ObjectOutputStream os = new ObjectOutputStream (fileStream );
//3.写入对象
os.writeObject(character);
//4.关闭ObjectOutputStream
os.close();

3.序列化对象时发生了什么?

对象的两种属性:状态和行为,行为存在于整个类层面,而状态存在于个别对象中,并且就是这些实例变量的值使同一类的对象拥有了特殊性。

当对象被序列化时,序列化的对象保存了实例变量的值,因此,解序列化时能够保证还原的对象与之前被序列化的对象一模一样。

并且被该对象引用的所有对象都会被序列化。

只有实现Serializable这个接口的类,才能被序列化。Serializable接口的目的是声明实现它的类是可以被序列化的。

因此,序列化是全或无的,如何想要序列化一个对象,那么这个对象所引用的所有对象都应当是可序列化的,否则序列化就会全部失败。

如果一个实现Serializable接口的类中的某个实例变量不能被序列化,则将该变量标记为transient,序列化程序就会将其跳过。在还原对象时,实例变量会回到默认的状态。

如果transient的实例变量不重要,则重新初始化transient的实例变量也不影响;
如果transient的实例变量很重要,则需要在序列化时,将该实例变量的值保存下来,还原时,手动给设定原来的值。

4.解序列化

//1.创建出FileOutputStream
FileOutputStream fileStream = new FileOutputStream("文件名.ser");
//2.创建出ObjectOutputStream
ObjectOutputStream os = new ObjectOutputStream (fileStream );
//3.写入对象,每调用一次readObject方法就会读取一个对象,读的顺序与写的顺序相同
//如果读的次数超过写的次数就会抛出异常
object ob = os.readObject();
//4.关闭ObjectOutputStream
os.close();

5.解序列化时发生了什么?

当对象被解序列化时,JAVA虚拟机会尝试在堆上创建新的对象,该对象的构造函数不会被执行,设定其状态与被序列化时对象的状态相同,但是除了transient的变量,transient变量会被赋值为null的对象引用或者基本数据类型的默认值。

JAVA虚拟机可以通过存储信息判断出对象的类型,尝试寻找和加载对象的类。
如果虚拟机找不到或者无法加载该类,则会抛出异常。

6.序列化和纯文本文件何时使用

如果只有自己写的JAVA程序会用到存储的数据,则使用序列化;
如果数据要被其他的程序引用,则使用纯文本