0

serializabledecomplierのようなマーカーインターフェイスや、andのようなクラスを見てきobjectInputStreamましたobjectOutputStream。私の質問は、独自のマーカーインターフェイスを作成できるかどうかです。

はいの場合は、何か特別なことをしたいと思います。たとえば、オブジェクトをシリアル化と同じメカニズムでシリアル化したいのですが、インターフェイスを使用します。

私がクロスチェックしたのは、objectOutputStream彼らが下の演算子のインスタンスをチェックしているということですwriteobject()

 else if ((paramObject instanceof Serializable)) {
        writeOrdinaryObject(paramObject, localObjectStreamClass, paramBoolean);
 }

マーカーインターフェイスを作成する方法と、マーカーインターフェイスを実装し、シリアル化の特別な処理を行う独自のクラスを作成する方法を教えてください。

4

2 に答える 2

2

マーカー インターフェイスは、メソッドを持たない単なる通常のインターフェイスです。

public interface MyMarkerInterface {
}

他のインターフェイスとまったく同じように実装します。

public class MyClass implements MyMarkerInterface {
    ...
}

とはいえ、このクラスのインスタンスがシリアル化される方法は何も変わりません。シリアル化メカニズムは、マーカー インターフェイスを気にしません。オブジェクトがシリアライズ可能かどうかのみをチェックします (そのクラスが を実装しているかどうかをチェックすることによってjava.io.Serializable)。

于 2013-02-17T16:53:44.470 に答える
1

マーカー インターフェイスは、メソッドや定数を定義しない任意のインターフェイスであるため、インターフェイスを実装する唯一の理由は、何らかの方法でクラスを「マーク」することです。このようなインターフェースは、次のように定義して使用できます。

// MyMarker.java
public interface MyMarker { /* just a marker */ }

// MyClass.java
public class MyClass implements MyMarker { ... }

ただし、これはシリアル化とは関係ありません。

シリアライゼーションにカスタム処理が必要な場合は、 ObjectOutputStream に記載されreadObjectているようにwriteObjectクラスに実装できます。

シリアライゼーションおよびデシリアライゼーション プロセス中に特別な処理を必要とするクラスは、次の正確なシグネチャを持つ特別なメソッドを実装する必要があります。

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

writeObject メソッドは、対応する readObject メソッドが復元できるように、特定のクラスのオブジェクトの状態を書き込む役割を果たします。メソッドは、オブジェクトのスーパークラスまたはサブクラスに属する状態に関与する必要はありません。writeObject メソッドを使用して個々のフィールドを ObjectOutputStream に書き込むか、DataOutput でサポートされているプリミティブ データ型のメソッドを使用して、状態を保存します。

于 2013-02-17T16:53:32.717 に答える