我需要同步writeObject()吗?

时间:2012-04-11 09:40:27

标签: java serialization

我有一些通过RMI序列化同时访问的对象。最近我写了自定义序列化方法:

/** This method is made to omit serialization of this.order */
private void writeObject(java.io.ObjectOutputStream out)
  throws java.io.IOException
{
    Order tmpOrder = this.order;
    this.order = null;
    out.defaultWriteObject();
    this.order = tmpOrder;
}

private void readObject(java.io.ObjectInputStream in)
  throws java.io.IOException, ClassNotFoundException
{
    in.defaultReadObject();
}

我不想允许通过并发RMI线程来破坏this.order。

  1. 我是否需要使writeObject同步?或
  2. RMI框架是否尽力同步对象的访问权限?
  3. 在第二种情况下,我的同步甚至可能导致RMI死锁。 JAVA API的一般合同是一个方法由一个线程调用,除非具体说明。因此,如果我应该遵循规则,我应该保留writeObject w / o任何同步。这是对的吗?

    在没有回答问题的情况下,我的问题的另一个解决方案肯定是声明private static final ObjectStreamField[] serialPersistentFields。 (我不能使场瞬态,因为该对象不仅是DTO而且是JPA实体)

2 个答案:

答案 0 :(得分:2)

  

我有一些RMI同时访问的对象   序列

不,不。您有一些对象可以通过对象序列化同时访问。

  

RMI框架是否尽力同步对象的访问?

没有。对象序列化框架可能,但未指定。

答案 1 :(得分:1)

尝试序列化同时使用的对象会导致混乱。当然要读取一致状态甚至是格式良好的状态,通常需要独占锁定。如果同步writeObject,那么你就会遇到极端问题,确保锁定顺序很好。

添加serialPersistentFields(拼写正确:)应该与制作字段transient具有相同的行为。制作order transient会阻止它被写出来,这似乎是您在问题代码中尝试的内容。使用ObjectOutputStream.putFields也可以实现类似的目标。