代码之家  ›  专栏  ›  技术社区  ›  PeterMmm

Java序列化问题

  •  1
  • PeterMmm  · 技术社区  · 16 年前

    我有以下代码将数据序列化到文件中:

    out = new ObjectOutputStream(new FileOutputStream(file));
    out.writeObject(chunk);
    out.flush();
    

    in = new ObjectInputStream(new FileInputStream(file));
    Chunk chunk = (Chunk) in.readObject();
    

    奇怪的是,当我读取数据时,所有成员都设置为默认值,我没有收到我之前写的数据。

    如果我使用XML变体,一切都会很好。

    e = new XMLEncoder(new FileOutputStream(file));
    e.writeObject(chunk);
    e.flush();
    

    e = new XMLDecoder(new FileInputStream(file));
    Chunk chunk = (Chunk) e.readObject();
    

    二进制格式有什么问题?

    好的,我现在明白了: 是一个包含中的类的复杂类,其他类包含中的其他类,以此类推。在某些时候,所包含的类被声明为Object,并且应该是可序列化的。正如Steve所说。

    谢谢你的回答。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Steve B.    16 年前

    虽然我想不出一个很好的理由来解释为什么一个解码器的工作方式与另一个不同,但我建议发布Chunk对象的代码。需要注意的事项:

    • 您是否声明任何字段为瞬态?这些不会被序列化
    • 默认值是在构造函数中被覆盖,还是在反序列化操作中不会被调用的其他地方被覆盖?
        2
  •  2
  •   Michael Borgwardt    16 年前

    我能想到的在序列化过程中将字段设置为默认值的唯一原因是,它们被定义为 transient .

    如果不是这样,试着把你的代码提炼成一个小的、自包含的程序来重现问题。最有可能的是,在执行此操作时,您会发现问题的原因,否则请将其发布在此处。

        3
  •  0
  •   Jim P    16 年前

    除了其他人提到的明显的瞬态字段之外,另一种(诚然不太可能)的可能性是,Chunk可能实现了Externalizable,但实际上并没有覆盖必要的writeExternal/readExternal方法。这也解释了XMLEncoder的工作原理。

    推荐文章