如何实现序列化,有什么意义
- (1)实现Serializable接口或Externalizable接口,并且视情况而定指定一个序列化版本ID(serialVersionUID)值;而且要保留公共的无参构造。
- (2)如果某个对象的属性也是引用数据类型,那么该数据类型也要实现Serializable接口或Externalizable接口;
- (3)如果要序列化,则使用一个输出流来构造一个对象输出流ObjectOutputStream并通过writeObject(Object obj)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流ObjectInputStream,然后通过readObject方法从流中读取对象。
- (4)如果某些属性不参与序列化,如果是实现Serializable接口的,直接在属性前面加transient修饰,如果是实现Externalizable接口,那么只要在重写writeExternal()和readExternal()方法时,不处理该属性即可。
- (5)注意:static修饰的属性不会被序列化
- 意义:
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,即把对象的内容转成二进制数据。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。
序列化过程
//序列化过程:ObjectOutputStream:实现内存中的数据,写入到具体的文件中
@Test
public void testObjectOutputStream() throws Exception {
//1.创建文件和流
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
//操作基本数据类型
// oos.writeByte();
// oos.writeBoolean();
//2.操作对象
oos.writeObject(new String("Tom"));
oos.flush();//刷新
oos.writeObject(new String("王辰硕"));
oos.flush();//刷新
//3.关闭资源
oos.close();
}
反序列化过程
//反序列化过程:ObjectInputStream:将磁盘文件中保存的对象,还原为内存中的对象
@Test
public void testObjectInputStream() throws IOException, ClassNotFoundException {
//1.
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"));
//2.
String s1 = (String) ois.readObject();
System.out.println(s1);
String s2 = (String) ois.readObject();
System.out.println(s2);
//3.
ois.close();
}
自定义的类可序列化,则需要满足
要想自定义的类可序列化,则需要满足:
-
① 实现接口:java.io.Serializable
-
② 显式声明全局常量:serialVersionUID,用于唯一标识当前类
-
③ 要想当前类的对象可序列化,必须其所有的属性也是可以序列化的
-
说明:
- 默认情况下,基本数据类型的变量都可以序列化
- ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
public class Person implements Serializable {
static final long serialVersionUID = 43453452L;
private int age;
private String name;
private Account acct;
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
", acct=" + acct +
'}';
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public Person() {
}
public Person(int age, String name, Account acct) {
this.age = age;
this.name = name;
this.acct = acct;
}
}
class Account implements Serializable {
private double balance;
static final long serialVersionUID = 43456453452L;
@Override
public String toString() {
return "Account{" +
"balance=" + balance +
'}';
}
public Account(double balance) {
this.balance = balance;
}
}