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フレームワークは、オブジェクトへのアクセスを同期するために最善を尽くしていますか?

2番目のケースでは、同期によってRMIでデッドロックが発生する可能性もあります。JAVA APIの一般的な契約では、特に明記されていない限り、メソッドは1つのスレッドによって呼び出されます。したがって、ルールに従う必要がある場合は、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 に答える