序列化¶
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

在Java里面需要序列化,必须实现java.io.Serializable接口
在开发中很少定义private long serialVersionUID = 1L,因为会造成后期代码维护的困扰。而在Java代码编译的时候,会自动加入该属性,所以没有必要写这样的属性。
序列化和反序列化¶
在Java中序列化本身是有自己的标准格式,只有按照这个格式定义序列化,才可以操作我们的反序列化。
在实现序列化和反序列化的过程中,最好使用java.io中提供的类;
| 【序列】ObjectOutputStream | 【反序列】ObjectInputStream |
|---|---|
| public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants | public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants |
| public ObjectOutputStream(OutputStream out) throws IOException | public ObjectInputStream(InputStream in) throws IOException |
| public final void writeObject(Object obj) throws IOException | public final Object readObject() throws IOException, ClassNotFoundException |

范例:
import java.io.*;
class Ball implements Serializable {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
public class TestDemo {
private static final File BALL_FILE = new File("D:" + File.separator + "ball.ser");
public static void serial( ) throws Exception {
Ball ball = new Ball();
ball.setName("李宁");
ball.setPrice(22.22);
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(BALL_FILE));
oos.writeObject(ball);
oos.close();
}
public static void deserial()throws Exception{
ObjectInputStream obs = new ObjectInputStream(new FileInputStream(BALL_FILE));
Ball ball = (Ball)obs.readObject();
obs.close();
System.out.println(ball);
}
public static void main(String[] args) throws Exception {
serial();
deserial();
}
}
此时,这是种序列化方法,只能被Java代码读取;
如果考虑到其他语言,就要使用到第三方提供的Jar支持
transient 关键字¶
在我们进行序列化的过程中,所有的属性都会被序列化保存;但是有些数据不需要保存,所有可以用transient关键字就可以实现不序列化;