1. 对象的序列化
- 对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象。
- 序列化是RMI(Remote Method Invoke - 远程方法调用)过程的参数和返回值都必须实现的机制,而RMI是JavaEE的基础。因此序列化机制是JavaEE平台的基础
- 如果需要让某个对象支持序列化机制,则必须让此类是可序列化的,为了让某各类是可序列化的,该类必须实现如下两个接口之一:
- Serializable:无任何方法,实现此接口表示可以序列化
- Externalizable
2.使用对象流序列化对象
- 若某个类实现了serializable接口,该类的对象就是可序列化的:
- 创建一个ObjectOutputStream
- 调用ObjectOutputStream对象的writeObject()方法输出可序列化对象
- 反序列化
- 创建一个ObjectInputStream
- 调用readObject()方法读取六种的对象
- 如果某个类的字段不是基本数据类型或String类型,而是某一个引用类型,那么这个引用类型必须是可序列化的,否则拥有该类型的Field的类也不能序列化
3. 示例代码
Address类
package com.atguigu.javase.lesson10;
import java.io.Serializable;
public class Address implements Serializable {
private String city;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Address(String city) {
this.city = city;
}
public Address() {
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
'}';
}
}
Person类:
package com.atguigu.javase.lesson10;
import java.io.Serializable;
public class Person implements Serializable{
//类的版本号,用于对象的序列化,具体用于读取对象时比对硬盘上的对象版本和程序中的对象的版本是否一致,
//若不一致,读取失败,并抛出异常
private static final long serialVersionUID = -297923778545480370L;
private String name;
private int age;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
SerializableTest类:
package test.com.atguigu.javase.lesson10;
import com.atguigu.javase.lesson10.Address;
import com.atguigu.javase.lesson10.Person;
import org.junit.Test;
import java.io.*;
public class SerializableTestTest {
@Test
public void testSerializable() throws IOException {
Person person = new Person("AA",12,new Address("beijing"));
//使用ObjectOutputStream把对象写到硬盘上
OutputStream out = new FileOutputStream("obj.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
objectOutputStream.writeObject(person);
out.close();
objectOutputStream.close();
}
@Test
public void testInputObjectStream() throws IOException, ClassNotFoundException {
InputStream in = new FileInputStream("obj.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(in);
Object obj = objectInputStream.readObject();
System.out.println(obj);
objectInputStream.close();
in.close();
}
}