【发布时间】:2015-04-25 05:11:26
【问题描述】:
我正在尝试对两个不同类型的实例进行非常基本的 Java 序列化。这是第一个Java类型的类结构:
class Ancestor {
int ai = 1;
String as = "abc";
}
class DescendentSer extends Ancestor implements java.io.Serializable{
int diser = 2;
String dsser = "xyz";
@Override
public String toString (){
return diser + " " + dsser + " " +ai+" "+as ;
}
}
我尝试通过以下代码片段序列化“DescendentSer”:
FileOutputStream fos = new FileOutputStream("C:\\CoreCod\\serial.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new DescendentSer());
oos.flush();
oos.close();
序列化完成后,“serial.dat”文件的大小恰好为 117 字节。然后我尝试序列化另一个实例,其类结构如下:
class IndDescendentSer implements java.io.Serializable{
int diser = 2;
String dsser = "xyz";
@Override
public String toString (){
return diser + " " + dsser ;
}
}
序列化“IndDescendentSer”的序列化代码与上面完全相同(只是对象实例将被序列化到的文件名和要序列化的实例与之前有所不同)。但是,这次序列化文件的大小恰好是 120 字节。
这一次,这个序列化文件中包含的字节怎么可能比旧的多,尤其是当“IndDescendentSer”的实例是 Object 类的直接后代而“DescendentSer”有它的超类型 - “Ancestor”时“ 班级。因此,预计“DescendentSer”将使用更多数据和元数据进行序列化。
【问题讨论】:
-
太多,无法在此处列出。类名、继承深度、字段数、字段名、字段内容……见Object Serialization Stream Protocol。
-
@EJP 我很想知道序列化过程中的“继承深度”,你能否详细说明所有超类型的行为(以线性方式),当一个serializable 子类型被序列化。我已经尝试过这种情况并且一切顺利,我从来不需要实现任何特殊方法,即'private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException , ClassNotFoundException;'请解释一下,提前谢谢。
标签: java serialization fileoutputstream serializable objectoutputstream