IO的应用(二)--序列化与反序列化
程序员文章站
2022-04-09 13:09:52
...
package com.bjpowernode.demo02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
/**
-
- 对象序列化
-
把对象转换为01二进制序列就是对象序列化
-
一般会把01序列保存到文件中, 使用ObjectOutputStream类
-
- 对象反序列化
-
把01序列转换为对象就是对象的反序列化
-
一般是从文件中把01序列读出来转换为对象, 使用ObjectInputStream类
-
- 对象如果要进行序列化/反序列化, 对象的类必须实现Serializable接口
-
Serializable接口是一想 标志接口,没有任何方法,
-
- 一般情况下,类实现了Serializable接口后,会手动的添加serialVersionUID字段, 防止反序列化出现异常
-
private static final long serialVersionUID = -564123146743165710L;
*/
public class Test04 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person p1 = new Person("lisi", 18);
//对象序列化,简单的可以理解为把对象保存到文件中
// saveObject( p1 );
Object obj = readObject();
System.out.println( obj );
/*
* 把对象保存到文件之后 ,又修改了类的结构, 再进行反序列化时, 就会出现异常 java.io.InvalidClassException:
* com.bjpowernode.demo02.Person; local class incompatible:
* stream classdesc serialVersionUID = -3136557166480575792,
* local class serialVersionUID = 198229193265816609
* 分析:
* 类实现了Serializable接口后,系统会自动生成一个字段serialVersionUID
* 当在类中添加了字段,修改了类的结构, 再次编译后,会生成一个新的serialVersionUID的字段值
* 再进行反序列化时, 两个serialVersionUID字段值不相同, 就会产生异常
* 解决方法:
* 保证在序列化和反序列化时, serialVersionUID字段的值一样即可
* 可以手动的添加serialVersionUID字段
*/
}
// 对象反序列化, 简单的理解为就是从文件中把对象读取出来
private static Object readObject() throws IOException, ClassNotFoundException {
InputStream in = new FileInputStream("d:/obj.txt");
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = ois.readObject();
ois.close();
return obj;
/*try {
return ois.readObject();
} finally {
ois.close();
}*/
}
//对象序列化
private static void saveObject(Object obj) throws IOException {
OutputStream out = new FileOutputStream("d:/obj.txt");
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(obj);
oos.close();
}
}
//一般情况下,类实现了Serializable接口后,会手动的添加serialVersionUID字段
class Person implements Serializable{
String name;
int age;
String gender = “男”;
//手动的定义一个序列化版本号
private static final long serialVersionUID = -564123146743165710L;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}