序列化对象
Java中的对象是伴随jvm而存在的,当虚拟机运行结束后,这些对象也随即被释放,当我们需要将这些对象保存时,就需要序列化这些对象(保存为文件存在磁盘上)
要实现序列化,则需要类实现Serializable接口。
如下,C类实现了Serializable接口,则这个类是可序列化的。
class C implements Serializable{
private int a;
private String b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
}
利用ObjectOutputStream序列化对象c:
public static void main(String[] agrs) throws IOException {
C c = new C();
c.setA(1);
c.setB("哈哈哈");
File file = new File("C:\Users\Administrator\Desktop\C.out");
FileOutputStream fo = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fo);
oos.writeObject(c);
oos.close();
}
这样在指定路径下就保存了这个对象。其中c.out的后缀名可以任意。
反序列化
序列化将对象保存在磁盘上,而反序列化则可以从磁盘读取一个文件将它转化为对象。当然这个文件是需要由序列化方式得到的。
public static void main(String[] agrs) throws IOException, ClassNotFoundException {
FileInputStream fi = new FileInputStream(file);
ObjectInputStream ooi = new ObjectInputStream(fi);
C cc = (C)ooi.readObject();
System.out.println(cc.getB());
}
输出结果:
1
哈哈哈
这样就将一个文件转化为了一个对象。
什么时候需要序列化?
序列化将对象以二进制的形式保存在文件中,可以在网络中传输这个对象,所以可以用于远程方法调用(RMI)
序列化之transient关键字
在序列化的或称中,如果成员变量中有List、map等集合对象,则在序列化的时候也会对集合内的对象进行序列化,导致效率低下,若我们不需要序列化某个成员变量,则只需要加上transient关键字即可。(另外用static修饰的变量也是不参与序列化的,因为static是属于类的,而不属于某个对象的)