序列化Java对象时,哪些因素控制文件大小



我正在尝试对两个不同类型的实例进行非常基本的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"将使用更多的数据和元数据进行序列化。

我认为它在名称中。一个字符存储在一个字节中,最后一个类的名称多了3个字母和3个字节。请注意,这可能是巧合,因为我对序列化不是很熟悉。

序列化是关于存储一个实例,它只与该类的变量有关,因为这些变量决定了类的状态。当加载变量时,实例是相同的,因为它与当前变量的行为相同,这正是我们想要的。

最新更新