前言: Java 对象序列化在初学的时候很不容易理解。
主要是理解 Java 对象序列化的基本概念。
概念: 将在内存中保存的对象变为二进制数据流的形式进行传输,或者是将其保存在文本中,并不意味着所有类都可以被序列化。需要被序列化的类对象往往需要传输使用。同时这个类必须实现java.io.Serializable
接口。但是这个类并没有任何的方法定义,只是一个标识接口
使用序列化的情况:
· 需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中。
· 序列化能实现深复制,即可以复制引用的对象。
定义可以被序列化的类:
@SuppressWarnings("serial")
class Person implements Serializable{
private String name;
private int age;
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
序列化对象时要保存的就是对象中的属性。所以默认情况下对象的属性将被转为二进制数据流。
如果想要实现序列化和反序列化对象操作,在java.io
提供有两个类:ObjectOutputStream序列化
、ObjectInputStream反序列化
下面例子简单实现对象序列化和反序列化:
第一步创建 Person 类:
@SuppressWarnings("serial")
class Person implements Serializable{
private String name;
private int age;
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
第二步创建测试类 TestDemo 类:
public class TestDemo {
public static final File file = new File("C:" + File.separator + "Users" + File.separator +"lenovo" + File.separator +"Desktop" + File.separator + "person.ser");
public static void main(String[] args) throws Exception {
ser(new Person("张三", 20));
dser();
}
public static void ser(Object obj) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(obj);
oos.close();
}
public static void dser() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
Object read = ois.readObject();
System.out.println(read);
ois.close();
}
}
个人博客链接:xvanning.cn