关于JAVA对象的序列化与反序列化的学习与理解
一、什么是序列化
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
二、如何序列化
将需要被序列化的类实现Serializable接口,该接口没有需要实现的法, implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以为obj的对象写出(即保存其状态),要恢复的话则用输入流。
三、简单的实现
先写一个Person类实现Serializable接口
import java.io.Serializable;
/**
* @desc:实现Serializable接口
* @author: Qroxy
* @QQ:1114031075
* @时间: 2018/11/3-12:29 PM
*/
public class Person implements Serializable {
private String name;
private int age;
private String sex;
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
四、进行序列化与反序列化
现在创建一个存储流的文件(test.txt)
import java.io.*;
/**
* @desc:序列化与反序列化
* @author: Qroxy
* @QQ:1114031075
* @时间: 2018/11/3-12:29 PM
*/
public class Serializable {
private static void SerializePerson() throws FileNotFoundException, IOException {
Person person = new Person("镇权", 22, "男");
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream("/Users/chun/我的项目/测试/test.txt"));
oo.writeObject(person);
System.out.println("Person对象序列化成功!");
oo.close();
}
//记得对错误抛出处理,以便出现错误快速定位
private static Person DeserializePerson() throws FileNotFoundException, IOException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/Users/chun/我的项目/测试/test.txt"));
Person person = null;
try {
person = (Person) objectInputStream.readObject();
System.out.println("Person对象反序列化成功!");
} catch (ClassNotFoundException e) {
new RuntimeException(e);
}
return person;
}
//写个主函数运行看一下效果
public static void main(String[] args) throws Exception {
SerializePerson();
Person person = DeserializePerson();
System.out.println(person);
}
}
运行结果:
再打开test.txt文件可以看到一堆16进制编码:
以上就就是序列化与反序列化的实现。
值得注意的是,如果报以下错误即对象没有继承Serializable接口。
当不想某个成员变量被序列化的话可以加transient关键字,当反序列化时该值就会为null。
五、Java IO知识的巩固学习
自身对java IO知识的掌握比较薄弱,这几天着重学习一下,并尽量做下笔记以加深印象。
1.关于java几种类型的流:
按照流的方向:输入流(inputStream)和输出流(outputStream)。
按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。
如 FileReader)和处理流(是对一个 已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要 带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)
按照处理数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于 InputStreamReader 和 OutputStreamWriter。
2. 字节流如何转为字符流(两者的区别)
字节输入流转字符输入流通过InputStreamReader实现,该类的构造函数可以传入 InputStream 对象。
字节输出流转字符输出流通过OutputStreamWriter实现,该类的构造函数可以传入 OutputStream 对象。
3.关于流的序列化与反序列化
如上!