Java对象的选择性序列化

4

考虑一个这样的情况:我在我的Java类中有10个字段。我想做一些特殊处理,比如处理其中的几个字段(比如说3个),而其他字段则通过默认的ObjectOutputStream实现进行序列化。有什么方法可以实现这个目的吗?

我可以在我的类中提供writeObject(ObjectOutputStream os)的实现来专门处理这3个字段,但是如何对其余的字段进行默认处理呢?

谢谢。


当然可以!尝试实现Object readResolve() throws ObjectStreamException方法,并在其中设置默认值。请参考规范,了解如何与“ObjectInputStream”精确地协同工作的详细信息。 - Eric Galluzzo
1个回答

3
您可以按照以下步骤进行操作:
  • 将三个特殊字段声明为瞬态的
  • 实现writeObject(ObjectOutputStream out)方法,并在此方法中:
  • 使用ObjectOutputStream.defaultWriteObject()以默认方式写入所有其他字段
  • 然后添加特殊字段的自定义序列化

并添加类似的实现来读取对象。

public class MyClass implements Serializable
{
    private void writeObject(java.io.ObjectOutputStream out) throws IOException
    {
        out.defaultWriteObject();
        // add code to write the special fields
    }

    private void readObject(java.io.ObjectInputStream in) throws IOException
    {
        in.defaultReadObject();
        // add code to read the special fields
    }

    private transient int special1;
    ...
}

这三个“特殊”的字段声明为transient是否有任何原因?如果我理解正确,transient在JAVA中的意思是“不应该被序列化”。 - TT.
@TT 作为瞬态字段,它们将被 ObjectOutputStream.defaultWriteObject()ObjectInputStream.defaultReadObject() 忽略。 - wero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接