1、对象序列化是指将内存中保存的对象以二进制数据流的形式进行处理传输,可以实现对象(在堆内存中)的保存或网络传输。
但是并不是所有的对象都可以被序列化,如果希望对象被序列化那么对象所在的类一定要实现java.io.Serializable父接口,作为序列化的标记,这个接口中没有任何方法,其描述的是一种类的能力,Java中另一个描述能力的接口是Closeable接口。
2、序列化与反序列化处理
实现序列化与反序列化操作的两个类:
序列化:public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
构造方法:public ObjectOutputStream(OutputStream out) throws IOException
实现序列化的方法:public final void writeObject(Object obj) throws IOException
反序列化:public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
构造方法:public ObjectInputStream(InputStream in) throws IOException
实现反序列化的方法:public final Object readObject() throws IOException,ClassNotFoundException
3、transient关键字
默认情况下当执行了对象序列化之后,会将类中的全部属性内容进行序列化,当不需要对某些属性进行实例化的时候可以在属性定义上使用transient关键字。
此时,在进行序列化处理的时候,该属性的内容是不会被保存下来的,即读取时读到的是该属性的默认值。
当类中有一些需要计算保存的属性内容往往是不需要被序列化的。开发中大部分需要被序列化的类往往都是简单java类,所以该关键字的使用频率不高。
实现序列化与反序列化:
import java.io.*;
public class RandomAccessFileDemo {
private static final File SAVE_FILE = new File("d:" + File.separator + "a.txt") ; //操作文件
public static void main(String[] args) throws Exception {
// saveObject(new Person("一只瓶子a", 18)) ;
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 {
private String name ;
private transient int age ;
public Person(String name , int age) {
this.name = name ;
this.age = age ;
}
public String toString() {
return "name:" + this.name + "-年龄:" + this.age ;
}
}