序列化和反序列化的概述
序列化就是把对象存储到文件中。
要想实现对象的序列化 ,这个类必须要实现serializable接口(充当一个标记作用)
有了这个标记,在序列化时,系统会自动分配一个序列号(用作校对序列前后,也可手动指定)
对象序列化流
ObjectOutPutStream (对象输出流) 和 ObjectInputStream (对象输入流)
ObjectOutPutStream (对象输出流)
ObjectOutPutStream 继承自 OutPutStream类
它特有的方法: writerObject()
调用此方法 将对象写入到文件中
// 使用步骤
/*1、先创建一个ObjectOutputStream对象,构造方法传入一个FileOutputStream(指定序列化后输出地址)
2、调用特有方法 wirterObject 方法 写入文件
3、释放资源
*/
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“c:\\abc.txt”));
oos.writerObject(new student("xiaoming",12)); // 写入一个自定义对象 student
oos.close(); //3、释放资源
ObjectInputStream (对象输入流)
ObjectInputStream 继承自 InputStream类
它特有的方法: readObject()
调用此方法 将文件中读取对象到内存中
序列化会出现的问题
transient 关键字
若类中的某些成员变量,不想暴露出原有的数值,则可以考虑使用 transient 关键字修饰变量(能被访问到,但原有数值被默认值0覆盖)
InvalidclassException 异常
出现了 InvalidclassException 异常,意味着序列化前和序列化后的序列号(默认由系统分配)不一致
为何出现异常?
因为序列化前系统会分配给类一个序列号(A1),后来又对类进行了修改,此时系统再次分配一个序列号(B2)
这时候,对其进行反序列得出的序列号跟原来的不一致(A1 – B2)。
如何解决?
在类中指定一个序列号 serialVersionUID
private static final long serialVersionUID = 1L;// 手动指派
PrintStream打印输出流
特点
只能读,不能写
它本身就具有打印字符的方法
常用的 print println
由于它继承自 OutputStream 类 有 writer 方法
print writer 方法各不相同
print() 直接输出 括号里面的内容
writer() 会把括号里面的内容,进行查找码表进行解码 ( 97 -> a )
System 的 setOut方法
调用此方法可以重定义输出 打印流内容
System.out.print("打印在控制台显示");
//创建输出流对象
PrintStream ps = new PrintStream(“c:\\abc.txt”);
//重新定义输出流方向
System.setOut(ps);
System.out.print("我将会在abc文本文件中存在");
//释放资源
ps.close();
来源:CSDN
作者:JohnsonHtao
链接:https://blog.csdn.net/JohnsonHtao/article/details/104628605