4

次のコードを検討してください。

public class LIMSGrid extends ClientEventSource implements Focusable, FramingBlockWrapper {

  //cell that is curently in edit mode
  private CellCoord editingCell = null;

  //framing block info
  private FramingBlock framingBlock;   

}

interfaceClientEventSourceを実装するクラスを拡張するようになりました。SerializableクラスCellCoordFramingBlockは、多数の getter と setter を持つ POJOS です。editingCellFindBugs は、フィールドとframingBlockフィールドについて次のように不平を言っています。

この Serializable クラスは、transient、Serializable、または java.lang.Object のいずれでもない非プリミティブ インスタンス フィールドを定義し、Externalizable インターフェイスまたは readObject() および writeObject() メソッドを実装していないようです。シリアライズ不可能なオブジェクトがこのフィールドに格納されている場合、このクラスのオブジェクトは正しくデシリアライズされません。

インスタンスフィールドが "java.lang.Object" ではないということを除いて、すべて問題ありません。これは完全に誤解を招くものですか、それともここでいくつかの基本事項が欠けていますか?

4

3 に答える 3

5

私の推測では (推測にすぎません) java.lang.object、インスタンスを参照しても FindBugs はこの警告をトリガーしません。この場合、クラスはあらゆる種類のオブジェクト (コレクションなど) を保持できる汎用コンテナーであると見なされるためです。 .

その場合、クラスのユーザーは、コンテナをシリアライズ可能にしたい場合、コンテナに格納されたオブジェクトがシリアライズ可能であることを確認する必要があります。(ArrayList がシリアライズ可能であるように、リスト内にシリアライズ可能なオブジェクトを格納する場合に限ります)。

于 2012-07-27T09:08:13.170 に答える
0

このエラーを回避するには、CellCoord と FramingBlock をシリアライズ可能にする必要があります。それらをシリアライズしたくない場合は、それらを一時的として設定する必要があります。

于 2012-07-27T09:04:15.823 に答える
-1

シリアライズ可能を拡張するクラスで定義されたオブジェクトのいずれかがある場合、クラスのオブジェクトは正しくデシリアライズされません。クラスのオブジェクトがその状態を保存したい場合、一時的でもシリアル化可能でもない1つの非プリミティブインスタンスフィールドのためだけに、それを行うことができないためです。

于 2015-03-13T11:00:21.630 に答える