java 对象系列化 (Serializable)
对象序列化:就是将一个对象转换为二进制的数据流。
如果一个类的对象要想实现对象系列化,则对象所在的类必须实现Serializable接口。在此接口中没有任何的方法,此接口只是作为一个标识,表示本来的对象具备了序列化的能力而已。
如果想要完成对象的序列化,则还要依靠ObjectOutputStream类和ObjectInputStream类,前者属于序列化操作,而后者属于反序列化操作。
实例:
- import java.io.Serializable;
- public class Person implements Serializable {
- private String name;
- private int age;
- public Person(String name, int age) {
- super();
- this.name = name;
- this.age = age;
- }
- public String toString() {
- return "姓名:" + this.name + " 年龄: " + this.age;
- }
- }
使用ObjectOutputStream完成序列化的操作
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.ObjectOutputStream;
- public class ObjectOutputStreamDemo {
- public static void main(String[] args) throws Exception {
- File file = new File("D:" + File.separator + "Person.txt");
- ObjectOutputStream objectOutputStream = null;
- objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
- objectOutputStream.writeObject(new Person("singsong", 23));
- objectOutputStream.close();
- }
- }
使用ObjectInputStream完成反序列化操作
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.ObjectInputStream;
- public class ObjectInputStreamDemo {
- public static void main(String[] args) throws Exception {
- File file = new File("D:" + File.separator + "person.txt");
- ObjectInputStream objectInputStream = null;
- objectInputStream = new ObjectInputStream(new FileInputStream(file));
- Object object = objectInputStream.readObject();
- Person person = (Person) object;
- System.out.println(person);
- }
- }
运行结果:
- 姓名:singsong 年龄: 23
以上的操作实际上是将整个的对象进行了序列化的操作,如果假如类中某个属性不希望被序列化的话,则要使用transient关键字声明。
实例:修改Person类:
- import java.io.Serializable;
- public class Person implements Serializable {
- private transient String name;
- private transient int age;
- public Person(String name, int age) {
- super();
- this.name = name;
- this.age = age;
- }
- public String toString() {
- return "姓名:" + this.name + " 年龄: " + this.age;
- }
- }
然后再进行序列化和反系列化操作,运行结果:
- 姓名:null 年龄: 0
显示的是默认值
既然可以对一个对象进行系列化,那么能不能同时对多个对象一起进行系列化操作
Object类可以接收任意的引用数据类型,包括数组。
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- public class ArraySerDemo {
- public static void main(String[] args) throws Exception {
- Person person[] = { new Person("张三", 21), new Person("李四", 22),
- new Person("王五", 23) };
- ser(person);
- Person[] persons = (Person[]) dser();
- print(person);
- }
- public static void ser(Object object) throws Exception {
- File file = new File("D:" + File.separator + "Person.txt");
- ObjectOutputStream objectOutputStream = null;
- objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
- objectOutputStream.writeObject(object);
- objectOutputStream.close();
- }
- public static Object dser() throws Exception {
- Object temp = null;
- File file = new File("D:" + File.separator + "person.txt");
- ObjectInputStream objectInputStream = null;
- objectInputStream = new ObjectInputStream(new FileInputStream(file));
- temp = objectInputStream.readObject();
- return temp;
- }
- public static void print(Person persons[]) {
- for (Person person : persons)
- System.out.println(person);
- }
- }
运行结果:
- 姓名:张三 年龄: 21
- 姓名:李四 年龄: 22
- 姓名:王五 年龄: 23