0

Serializable がマーカー インターフェイスであることは知っています。次に、以下のメソッド シグネチャは何を意味するのでしょうか。

 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
 private void readObjectNoData() 
     throws ObjectStreamException;

これはhttp://docs.oracle.com/javase/6/docs/api/java/io/Serializable.htmlからのものです

ページには、「シリアル化および逆シリアル化プロセス中に特別な処理が必要なクラスは、これらの正確なシグネチャを持つ特別なメソッドを実装する必要があります:」と書かれています。

よくわかりません。Serializable はマーカー インターフェイスかどうか?

4

4 に答える 4

1

はい、Serializable はマーカー インターフェイスです。これらのメソッドを実装する必要があるのは、特別な処理が必要なクラスだけです。

別の言い方をすればこれらのメソッドを 1 つ以上実装して、クラスのインスタンスをシリアル化または逆シリアル化する方法をカスタマイズできます。デフォルトの動作はほとんどのニーズに適しているため、通常は必要ありません。

于 2013-03-11T12:43:18.563 に答える
1

これらのメソッドは、シリアル化プロセスをカスタマイズするために使用されます。例を挙げます。

class Person implements java.io.Serializable {

int id;
String name;
String city;

Person(int id, String name, String city) {
    this.id = id;
    this.name = name;
this.city = city;
}

private void writeObject(java.io.ObjectOutputStream stream)
        throws IOException {
    stream.writeInt("ID : " + id);
    stream.writeObject("Name : " + name);
    stream.writeObject("City : " + city);
}

private void readObject(java.io.ObjectInputStream stream)
        throws IOException, ClassNotFoundException {
    id = stream.readInt();
    name = (String) stream.readObject();
    city = (String) stream.readObject();
}

public String toString() {
    return id + "\t" + name + "\t" + city + "\t";
}
}

シリアル化は、これらのメソッドを使用してカスタマイズされることに注意してください。デフォルトのシリアル化メソッドでは実行できないフィールドをシリアル化するときに、writeObject メソッドに文字列定数を追加しました。

于 2013-03-11T12:52:25.150 に答える
0

その理由について、ここで勝手な推測を投げかけます。タグを使用してどのフィールドがシリアライズ可能かを判別できるという事実を考えると、私の最初の考えは、シリアライズの内部の仕組み (たとえばObjectOutputStream.

writeObjectそのため、メソッドは実際には、オブジェクトに定義された同じ署名を持つプライベート メソッドがあるかどうかもチェックし、存在する場合はそれを呼び出します。結局、その同じメソッドはすでにリフレクションを使用して、どのフィールドをどのようにシリアル化するかを決定しているため、特別なメソッドの存在を確認することも、私が信じている大きなオーバーヘッドではありません...

少し奇妙に思えるかもしれませんが、まともな解決策のように思えます。ほとんどの場合は一般的なものであるため、インターフェイスでの実装を強制するのは多すぎます。Java のような単一継承モデルでは、抽象クラスを使用することはできませんでした。C# は属性 ( @Java の注釈に相当) を使用します。

より多くの知識を持っている人がこれについてより多くの光を当てることができることを願っています. :)

于 2013-03-11T12:53:06.150 に答える