【问题标题】:What factors govern file size when Java Object is Serialized当 Java 对象被序列化时,哪些因素决定了文件大小
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 确实,类名似乎负责额外的 3 个字节。那么来到实际的主题问题,当 Java 对象被序列化时,哪些因素决定了实际的文件大小。
  • 最后一段没有多大意义。尝试改写它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2017-07-31
  • 2011-11-01
相关资源
最近更新 更多