今天来学习序列化流ObjectOutputStream,反序列化流ObjectInputStream。那什么是序列化操作?
将对象以流的形式从内存写出到本地磁盘
什么是反序列化操作?
将本地磁盘中的对象以流的形式还原成内存中的对象
注意:如果一个对象想要被序列化和反序列化操作的话,该对象的类一定要实现序列化接口
一:序列化流ObjectOutputStream
1:构造方法
public static void main(String[] args) throws Exception {
ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
System.out.println(oss);
}
}
控制台输出:
java.io.ObjectOutputStream@15db9742
2:成员方法
public final void writeObject(Object obj)
public class D01 {
public class D01 {
public static void main(String[] args) throws Exception {
ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
oss.writeObject(new person("潇寒", 18));
System.out.println("写入成功!");
}
}
/**
* person类
*/
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
private String name;
private int age;
public person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
}
控制台输出:
写入成功!
这里需要注意一下,要想将对象写入文件对象需要实现序列化父类Serializable。
二:反序列化流ObjectInputStream
1:构造方法
public static void main(String[] args) throws Exception {
ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
System.out.println(inp);
}
控制台输出:
java.io.ObjectInputStream@e9e54c2
2:成员方法
public final Object readObject()
public class D01 {
public static void main(String[] args) throws Exception {
ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
Object per = inp.readObject();
System.out.println(per);
}
}
控制台输出:
person [name=潇寒, age=18]
三:一个小问题
我们先来做一个小例子,还是用上方的代码:
public class D01 {
public static void main(String[] args) throws Exception {
ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
oss.writeObject(new person("潇寒", 18));
System.out.println("写入成功!");
}
}
/**
* person类
*/
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
private String name;
private int age;
public person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
}
执行上方的代码,我们将person类的对象就写入了aaa.txt文件。
接下来,我们修改一下person类,增加一个sex属性。然后,我们再来读取aaa.txt文件,看会发生什么情况
public class D01 {
public static void main(String[] args) throws Exception {
ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
Object per = inp.readObject();
System.out.println(per);
}
}
/**
* person类
*/
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
private String name;
private int age;
private int sex;
public person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
}
运行代码,控制台输出:
Exception in thread "main" java.io.InvalidClassException: D0809.person;
local class incompatible: stream classdesc serialVersionUID = -3798699982461439593, local class serialVersionUID = 6522508725872980959
报错了,为什么会报错呢?类修改了之后,就变成了一个新类。
那么怎么解决这个问题呢?
很简单,就是制定这个类的serialVersionUID即可。代码如下:
public class D01 {
public static void main(String[] args) throws Exception {
ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream("aaa.txt"));
oss.writeObject(new person("潇寒", 18));
System.out.println("写入成功!");
ObjectInputStream inp = new ObjectInputStream(new FileInputStream("aaa.txt"));
Object per = inp.readObject();
System.out.println(per);
}
}
/**
* person类
*/
// 这里使用的时候需要注意一下,这个类要实现序列化父类
class person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private int sex;
public person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
}
控制台输出:
写入成功!
person [name=潇寒, age=18]
至此,io流就全部学完了。知识点稍微有点多。
有好的建议,请在下方输入您的评论。