2009-04-03 10 views
2

私はシリアル化の基本について熟知しています。今ではそれを使用しています。私はReportBase抽象クラスと基本クラスから派生した複数のレポートを持つ既存の報告システムを持っています。これらはそれぞれ、コンストラクタで指定されたさまざまなレポートパラメータと、場合によっては追加のメソッドを持っています。派生したクラスのいずれかをシリアル化し、その後、派生したクラスの型を知らなくても逆シリアル化することは可能ですか?C#deserialize未定義の抽象クラス

また、これを達成するために反射で何かできますか?私はおそらくデータベースにシリアル化されたオブジェクトを格納するので、私が想定している別のフィールドにレポートクラスを追加することができます。

答えて

4

はい、確かにはオブジェクトの実際のタイプを知らずに逆シリアル化できます。実際、デシリアライズするために型について何も知る必要はありません。逆シリアル化は、バイナリの意味では、バイト配列を元の型に変換し、その参照をオブジェクトとして返します。その後、インスタンスの任意の正当な型にキャストすることは自由です。

たとえば、次のコードは、ストリームをオブジェクトに逆シリアル化し、その参照をReportBase型に変換します。

public static void Deserialize(Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    object obj = formatter.Deserialize(stream); 
    ReportBase report= (ReportBase) obj; 
} 

私はそれが可能であると述べました。これを動作させるには、streamがReportBase派生クラスの有効なシリアル化されたインスタンスを指していなければならず、そのクラスは直列化の規則に準拠していなければなりません。

それはあるように意図されたクラスを作成することは非常に簡単ですが、直列化可能ではありません。http://blogs.msdn.com/jaredpar/archive/2009/03/31/is-it-serializable.aspx

+0

おかげで私はそれを行くを与えます。何らかの理由で私はDeserializeがタイプを要求していると思っていました。私はそれを使ってからしばらくしていました。 – PeteT

関連する問題