C#BinaryFormatter-バイナリデータのクラスを確認する方法
-
03-07-2019 - |
質問
オブジェクトをデシリアライズしたいのですが、クラスが事前にわかりません。したがって、次のコードを検討してください...
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);
解決
やる:
object result = formatter.Deserialize(stream);
Type t = result.GetType();
他のヒント
主にleppieが言うように...
いくつかの既知のタイプについてテストする場合は、「is」「/」「as」を使用できます。
MyFoo foo = result As MyFoo;
if(foo != null) { // it was one of those
// special code
}
しかし、一般的には、シリアライザにそのような詳細を心配させます...
もちろん、XMLベースのシリアライザーとは大きく異なります。なぜなら、シリアライザーが何を取得したかを伝えるのではなく、シリアライザーに何を期待するのかを伝える必要があるからです。
いくつかの提案、
-
オブジェクトをキャストせずにオブジェクトをデシリアライズする場合myObject = formatter.Deserialize(stream);そして、「as」を使用します;演算子を使用して既知の型との型の互換性を確認すると、動作する可能性があります。
-
SerializationBinder型のBinaryFormatter.Binderプロパティを見てください。以前のバージョンのファイル形式との下位互換性を確保するために使用したことがあり、うまく機能しました。基本的に、デシリアライズする対象を完全に制御できます。
所属していません StackOverflow