XMLシリアル化に関するもう1つの質問。私はBase
クラスを持っており、Derived1
とDerived2
のクラスが継承されています。私はXML要素<base>
からそれらを逆直列化したいと考えています。Derived1
インスタンスをまたはDerived2
インスタンスの場合は<base attr="2">
に作成します。どうしたらいいですか?私はXmlSerializes
とXmlAttributeOverrides
を使用しています。ありがとうございますXMLシリアル化:属性値に応じて派生クラスをインスタンス化
0
A
答えて
0
編集:私はあなたの正確な状況に合わせて私の答えを完全に改訂しました。既にあなたのベースリストを正しくシリアル化していると仮定すると、以下のコードが有効になります。
通常、スイッチステートメントはOCPに違反するため、推奨しません。通常、多型がより良い答えです。しかし、迅速かつ汚れた解決法、および(あなたの場合のように)比較的少ない値を持つswitch文については、これはうまくいくでしょう。
重要事項:XMLシリアライザは、適切にシリアル化されていると仮定して、適切な派生クラスにデシリアライズします。しかし、何らかの理由でそれがあなたの状況に当てはまらない場合は、残りのコードが必要になります(switch文のforeach)。
private static void ImportDerivedClasses()
{
List<Base> bases;
string filePathAndName = @"c:\temp\SerializedBases.xml";
using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Base>));
bases = xmlSerializer.Deserialize(fileStream) as List<Base>;
}
// The rest of this is unnecessary if we originally serialized correctly.
List<Base> deserializedBases = new List<Base>();
foreach(Base baseClass in bases)
{
switch (baseClass.Attr)
{
case "1":
deserializedBases.Add(new Derived1());
break;
case "2":
deserializedBases.Add(new Derived2());
break;
default:
// Log warning
break;
}
}
}
+0
うわー、FxCopを抑制するときに使用するメッセージに!あなたは、あなたの特定のプロジェクトについて本当に知りません人のためにそれをカットすることができますか? – sq33G
関連する問題
- 1. Xmlのシリアル化基底クラスの属性
- 2. シリアル化にXML属性を入力
- 3. DataContract XMLシリアル化とXML属性
- 4. 属性を持つリストのXMLシリアル化
- 5. 同じ属性を持つxml要素を逆シリアル化する
- 6. C#。属性に応じて同じタイプに逆シリアル化します
- 7. XMLシリアル化による要素/属性値の書式設定
- 8. 派生クラスを基本クラスにシリアル化する方法は?
- 9. 基本クラスから派生クラスへxmlをシリアル化する問題
- 10. XmlSerializerを使用して派生クラスをシリアル化する
- 11. C#インスタンス化ベースオブジェクト派生オブジェクト
- 12. 派生テンプレートクラスオブジェクトのインスタンス化
- 13. Json.netは派生型をシリアル化/逆シリアル化しますか?
- 14. C#Xmlシリアライゼーション:クラスプロパティを親クラスの属性としてシリアル化する
- 15. インスタンスのシリアル化と逆シリアル化に反応します。
- 16. シリアル化カスタム属性は
- 17. 不変性とXMLシリアル化
- 18. JSONシリアル化に派生クラスのプロパティがありません
- 19. 派生クラスをインスタンス化するための基底クラスのファクトリメソッド
- 20. 派生クラスのコンストラクタの引数型に応じた基本クラスのテンプレートのインスタンス化
- 21. Treenodeから派生したXMLのシリアライズ/逆シリアル化
- 22. Json.NetはC#派生クラスへの逆シリアル化を行います。
- 23. WebApiは派生クラスで宣言された属性を例外からシリアル化できません
- 24. 派生型のJSON逆シリアル化
- 25. カプセル化されたオブジェクトの種類に応じて派生クラスを初期化します。
- 26. XMLは属性を持つ複合型をシリアル化します
- 27. 属性に応じて上位XMLノード値を取得
- 28. RestSharpを使用したXML属性の逆シリアル化
- 29. 属性付きXML CDATAを逆シリアル化する
- 30. XMLシリアル化とnull値 - C#
私の答えはあなたのために機能しますか? –