XmlSerializer
C#で、を使用して、基本クラスまたはいくつかの派生クラスのいずれかである可能性のあるオブジェクトを、事前に型を知らずに逆シリアル化するにはどうすればよいですか?
私の派生クラスはすべて、データメンバーを追加します。クラスオブジェクトをシリアル化および逆シリアル化できるシンプルなGUIを作成しました。ユーザーが入力することを選択したフィールドに基づいて、継承されたクラス(または基本クラスのみ)が適切であるため、オブジェクトをシリアル化します。
シリアル化に問題はありません。問題は逆シリアル化です。XmlSerializer
クラスを事前に知らなくても、データを正しい派生クラスに逆シリアル化するにはどうすればよいですか?私は現在XmlReader
、XMLファイルの最初のノードを読み取り、そこからクラスを決定するためにを作成しています。これは私の目的には機能するようですが、非常に洗練されていないソリューションのようです。
以下にサンプルコードを投稿しました。助言がありますか?
BaseType objectOfConcern = new BaseType();
XmlSerializer xserializer;
XmlTextReader xtextreader = new XmlTextReader(DEFAULT_FILENAME);
do { xtextreader.Read(); } while (xtextreader.NodeType != XmlNodeType.Element);
string objectType = xtextreader.Name;
xtextreader.Close();
FileStream fstream = new FileStream(DEFAULT_FILENAME, FileMode.Open);
switch (objectType)
{
case "type1":
xserializer = new XmlSerializer(typeof(DerivedType));
objectOfConcern = (DerivedType)xserializer.Deserialize(fstream);
//Load fields specific to that derived type here
whatever = (objectOfConcern as DerivedType).NoOfstreamubordinates.ToString();
case "xxx_1":
//code here
case "xxx_2":
//code here
case "xxx_n":
//code here
//and so forth
case "BaseType":
xserializer = new XmlSerializer(typeof(BaseType));
AssignEventHandler(xserializer);
objectOfConcern = (BaseType)xserializer.Deserialize(fstream);
}
//Assign all deserialized values from base class common to all derived classes here
//Close the FileStream
fstream.Close();