序列化简介
所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者网络传输。
然而并不是所有的对象都可以被序列化,在Java里面有一个强制性要求:如果要序列化的对象,那么对象所在的类一定要实现java.io.Serializable父接口,作为序列化的标记,这个接口没有任何的方法,因为它描述的是一种类的能力。
序列化与反序列化
有了序列化的支持类之后如果要想实现序列化与反序列化的操作可以利用以下两个类完成:
- 序列化:ObjectOutputStream
- 定义类:
public class ObjectOutputStream extends OutputStream implements ObjectOutput,ObjectStreamConstants
. - 构造方法:
public ObjectOutputStream(OutputStream out) throws IOException
- 操作方法:
public final void writeObject(Object obj) throws IOException
.
- 定义类:
- 反序列化:ObjectInputStream
- 定义类:
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
- 构造方法:
public ObjectInputStream(InputStream in) throws IOException
. - 操作方法:
public final void readObject(Object obj) throws IOException,ClassNotFoundException
.
- 定义类:
【范例】实现序列化与反序列化
package demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class JavaAPIDemo {
private static final File SAVE_FILE = new File("D:" + File.separator + "mldn.person");
public static void main(String[] args) throws Exception {
// saveObject(new Person("littlecat", 40));
System.out.println(loadObject());
}
public static void saveObject(Object obj) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
oos.writeObject(obj);//序列化
oos.close();
}
public static Object loadObject() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
Object obj = ois.readObject();//反序列化
ois.close();
return obj;
}
}
class Person implements Serializable {// Person类可以被序列化
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "姓名:" + this.name + "、年龄:" + this.age;
}
}
在Java中的对象序列化与反序列化必须使用内部提供的对象操作,因为这里牵扯到二进制格式,所以不能自定义处理,另外如果要想实现一组对象的是序列化,则可以使用对象数组完成。
transient关键字
默认情况下当执行了对象序列化的时候会将类中的全部属性的内容进行 全部的序列化操作,但是很多情况下有一些属性并不需要进行序列化的处理,这时候可以在属性定义上使用transient关键字来完成。
private transient String name;
在进行序列化处理的时候name属性的内容是不会被保持下来的,换言之,读取的数据name将是其对应数据类型的默认值“null”。如果假设类之中有一些是血药计算保持的属性内容往往是不需要被序列化的,这个时候就可以使用transient,但是实际开发之中大部分需要被序列化的类往往都是简单java类,所以这一个关键字的出现频率不高。
参考资料:https://edu.aliyun.com/lesson_1012_9018