19

Javaには、恐ろしくエラーが発生しやすい インターフェイスSerializableを実装する多くのクラス(Swingなど)が含まれています。

たとえば、TableModel拡張によってnewを実装する場合AbstractTableModel、新しいモデルはシリアル化可能である必要がありますが、この機能を使用する予定がないため、シリアル化可能ではなく、シリアル化可能である必要のない内部データ型が含まれている場合はどうなりますか?

そのような場合、 Sonarのようなツールはおかしくなります。Fooどちらも「クラスは非一時的でシリアル化できないインスタンスフィールドを定義する」と不平を言いますbar

だから私はtransient「フィールドFoo.barは一時的ですが、デシリアライズによって設定されていません」を得るためにそのフィールドを作成します

Sonarのようなツールでエラーが発生しないように、「いいえ、このクラスはシリアル化できません。シリアル化したくない」と言うことはできますか?

4

5 に答える 5

25

このJavaRevisitedの記事からの引用(#8を参照):

Javaのシリアル化を回避するには、クラスにwriteObject()メソッドとreadObject()メソッドを実装し、これらのメソッドからNotSerializableExceptionをスローする必要があります。

したがって、これをクラスに貼り付ける必要があります。

private void writeObject(java.io.ObjectOutputStream stream) throws java.io.IOException {
    throw new java.io.NotSerializableException( getClass().getName() );
}

private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException {
    throw new java.io.NotSerializableException( getClass().getName() );
}
于 2012-10-11T07:49:46.073 に答える
6

実装writeObject()readObject()スローするメソッドNotSerializableException

また

http://docs.oracle.com/javase/6/docs/platform/serialization/spec/security.html#4214

于 2012-10-11T07:50:45.450 に答える
1

あなたはそのようなものを使うことができますか?

@SuppressFBWarnings(justification = "This field need to be transient")
private transient SomeObject myTransientField;

Findbugの警告を抑制します。次のように、サポートする検証タイプを指定することもできます。

@SuppressFBWarnings("SE_TRANSIENT_FIELD_NOT_RESTORED")

完全なリストはそこにあります:http://findbugs.sourceforge.net/bugDescriptions.html

于 2015-11-18T21:52:43.210 に答える
0

私は次のようにメソッドを実装することを考えることができますprivate void writeObject()

private void writeObject(ObjectOutputStream oos) throws IOException {
    throw new UnsupportedOperationException("Not serializable!!!");
}

Externalizableまたは、の同様の実装を実装および記述できます。writeExternal()

どちらも「良い」方法ではありませんが、単なる回避策です。

于 2012-10-11T07:53:19.800 に答える
0

ここに表示される答えは、実際には、シリアル化可能とマークされたクラスのシリアル化または逆シリアル化を防ぐことができるかどうかを答えるだけです。ただし、質問は別のものでした。

「いいえ、このクラスはシリアル化できません。シリアル化したくない」と言って、Sonarなどのツールでエラーが発生しないようにすることはできますか?」

(それで、私はそれらの答えに対するそれらの多くの賛成票について疑問に思います...)

グーグルは答えを「ノー」のように思われる。ソナーはそのようなクラスは「誤検知」であると言うことができるが、それはソナーをいじくり回す必要がある。他の人のソナーによって検査されたコードを開発する開発者は、その可能性から利益を得ることができません。

そして、質問は実際に「ソナーのような」他のツールの解決策も求めているので、一般的に答えは「はい」ではありません---確かにそのようなツールのいくつかは「シリアル化可能+シリアル化不可能な非一時的フィールドを実装する」と主張します「トラブルを意味します。

于 2012-10-11T08:23:54.933 に答える