2011-07-08 6 views
3

これはシリアライズが初めてなので、これは簡単な質問かもしれませんが、私のgoogle-fuは今日弱いです。既知のスーパークラスのランダムな派生クラスを非直列化する

public class Base implements Serializable { 
    // ... 
} 

public class Der1 extends Base { 
    // ... 
} 

public class Der2 extends Base { 
    // ... 
} 

アリスは、ランダムに、Der1またはDer2のいずれかのオブジェクトを作成し、それをファイルにシリアライズし、ボブに送信します:

では、次のクラスがあるとします。 BobはこのオブジェクトのクラスがBaseのサブクラスであることを知っていますが、どのクラス(Aliceと同じクラス定義を持っているか)はわかりません。 Bobはファイルをどのようにしてデシリアライズして、適切なサブクラスのインスタンスにすることができますか?彼女は、オブジェクトのクラスを格納するために、これを使用して、それをシリアル化し、ボブに送信し

public DerClass implements Serializable { 
    public Class<? extends Base> class; 
} 

私が最初に考えたアリスは、このようなクラスを定義するということでした。 BobはこのファイルからDerClassオブジェクトを構成し、class変数を読み取り、それを使用して適切なサブクラスをインスタンス化し、直列化オブジェクトをそのオブジェクトに読み込みます。これは効果がありますか?より良い方法がありますか?

+1

私はいつも人々がこれらの「ランダムなクラス」を取得したのだろうと思います。実際の状況はどうですか?シリアライズされた書式には、それ自身を識別するための情報が含まれていなければなりません。 –

+0

@suszterpatt:もしあなたがここでBobのコードを書いていれば、あなたの質問はより親切であると思います。 –

答えて

5

デシリアライズアプリケーションでは、型を知る必要はなく、クラスパスで同じクラスを使用するだけで済みます。例えばアリスはボブが送るクラスとその親と扶養家族のすべてのクラスを持っている必要があります。

// Bob sends 
Base base = // some Base class 
objectOutputStream.writeObjec(base); 

// Alice receives 
Base base = (Base) objectInputStream.readObject(); 
+0

しかし、このようにして、アリスは派生型の 'base'を知ることができません。彼女は、実際の派生型「Der1」または「Der2」を使用することができます。どのようにその問題を解決するだろうか? –

+1

@JonasGröger彼女は 'if(base instanceof Der1){Der1 der1 =(Der1)base;/* something * /} else if(Base instanceof Der2)... ' –

+0

これは、新しいサブクラスがあるたびにシリアライズアルゴリズムを変更することです。 –

関連する問題