0

我有一些由 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 框架是否尽最大努力同步对对象的访问?

在第二种情况下,我的同步甚至可能导致 RMI 中的死锁。JAVA API 的一般约定是一个方法由一个线程调用,除非特别注明。因此,如果我应该遵守规则,我应该离开writeObject没有任何同步。这个对吗 ?

在不回答问题的情况下解决我的问题的另一种方法当然是声明private static final ObjectStreamField[] serialPersistentFields. (我不能使字段瞬态,因为该对象不仅是 DTO,而且也是 JPA 实体)

4

2 回答 2

2

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

不,你没有。您有一些对象序列化同时访问的对象。

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

否。对象序列化框架可能会,但未指定。

于 2012-04-11T09:48:49.077 回答
1

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

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

于 2012-04-11T10:53:06.927 回答