2

オブジェクトをデシリアライズしたいのですが、事前にクラスがわかりません。したがって、次のコードを検討してください...

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject)formatter.Deserialize(stream);

事前にクラスがわからない場合はどうすればよいですか? たとえば、「MyFile.bin」が MyObject または MyFoo だったとします。インスタンス化するオブジェクトを決定するにはどうすればよいですか?

何かのようなもの...

if (magic happens here == typeof(MyObject))  
    MyObject obj = (MyObject) formatter.Deserialize(stream);   
else if (more magic happens here == typeof(MyFoo))  
    MyFoo foo = (MyFoo)formatter.Deserialize(stream);
4

3 に答える 3

7

ただ行う:

object result = formatter.Deserialize(stream); 
Type t = result.GetType();
于 2008-10-20T11:48:59.093 に答える
1

主にレッピーの言う通り…

いくつかの既知のタイプについてテストしたい場合は、「is」/「as」を使用できます。

MyFoo foo = result As MyFoo;
if(foo != null) { // it was one of those
  // special code
}

しかし、一般的には、シリアライザーにそのような詳細を心配させます...

もちろん、xml ベースのシリアライザーとは大きく異なります。なぜなら、シリアライザーが何を取得したかを伝えるのではなく、何が期待されているかをシリアライザーに伝える必要があるからです。

于 2008-10-20T11:53:30.393 に答える
0

いくつかの提案、

  1. オブジェクトをキャストせずにオブジェクトをデシリアライズする場合 myObject = formatter.Deserialize(stream); 次に、「as」演算子を使用して、既知の型との型の互換性を確認すると、機能する可能性があります。

  2. タイプ SerializationBinder の BinaryFormatter.Binder プロパティを見てみましょう。これは、ファイル形式の古いバージョンとの下位互換性を維持するために以前に使用したことがあり、うまくいきました。基本的に、何が逆シリアル化されるかを完全に制御できます。

于 2008-10-20T11:52:11.397 に答える