抽象基本クラスを使用して汎用オブジェクトのリストをシリアライズする方法に関する良いサンプルです。非抽象基本クラスのサンプルはXML Serialize generic list of serializable objectsにリストされています。基本クラスはMicrosoft.Build.Utilities.TaskXML抽象基本クラスを持つシリアライズ可能オブジェクトの汎用リストをシリアル化します。
6
A
答えて
4
と似ています。厳密な型指定リストなどを使用できるように、いくつかの派生型を持つ抽象クラスを持つと便利なことがよくあります。
たとえば、抽象クラスであるDocumentFragmentクラスと、TextDocumentFragmentおよびCommentDocumentFragmentという2つの具象クラス(Willisのこの例)があります。
これにより、2つのタイプのオブジェクトのみを含むListプロパティを作成することができます。
あなたはXmlInclude属性は、それがかもしれないというクラスを教えて
[Serializable()]
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))]
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))]
public abstract class DocumentFragment {
...}
....あなたがエラーを取得するが、これは以下のコードで周りを取得するのは簡単です、このリストを返すWebサービスを作成しようとするとそれらの2つの派生クラスにシリアル化されます。
これは、以下のように実際のタイプを指定する属性をDocumentFragmentエレメントに生成します。
このメソッドを使用すると、派生クラスに固有の任意の追加プロパティも含まれます。
11
別の方法としては、醜いなし(...ジェネリックリスト自体に知られているタイプのリストを移動するためにXmlElementAttribute
を使用することも、より良い探してXML出力になります
using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
public abstract class Animal
{
public int Weight { get; set; }
}
public class Cat : Animal
{
public int FurLength { get; set; }
}
public class Fish : Animal
{
public int ScalesCount { get; set; }
}
public class AnimalFarm
{
[XmlElement(typeof(Cat))]
[XmlElement(typeof(Fish))]
public List<Animal> Animals { get; set; }
public AnimalFarm()
{
Animals = new List<Animal>();
}
}
public class Program
{
public static void Main()
{
AnimalFarm animalFarm = new AnimalFarm();
animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 });
animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 });
XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm));
serializer.Serialize(Console.Out, animalFarm);
}
}
...ですxsi:type
属性)...
<?xml version="1.0" encoding="ibm850"?>
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Cat>
<Weight>4000</Weight>
<FurLength>3</FurLength>
</Cat>
<Fish>
<Weight>200</Weight>
<ScalesCount>99</ScalesCount>
</Fish>
</AnimalFarm>
+0
で見つけることができます。 – Console
関連する問題
- 1. 抽象クラスのサブクラスのオブジェクトを持つ汎用リストを埋め込む
- 2. リストをシリアル化<T>親タグを持つ基本クラス
- 3. 抽象基本クラスのNHibernateとgenericリスト
- 4. 入れ子抽象基本クラスの汎用テンプレート
- 5. 派生クラスをシリアライズ可能にするために、抽象基本クラスをシリアル化する必要がありますか?
- 6. 抽象基本クラスのプロパティで汎用コレクションを使用できますか?
- 7. Jacksonは抽象クラスのサブクラスのオブジェクトのリストを逆シリアル化します
- 8. データベースの抽象基本クラスとサブクラスをモデル化します
- 9. 内部抽象クラスを持つコンテナクラスのGsonの逆シリアル化
- 10. 抽象基本クラスで@autowiredを使用
- 11. C#を使用してJava逆シリアル化可能オブジェクトをシリアライズ
- 12. Versionプロパティで抽象基底クラスSession.Lockと抽象基本クラス
- 13. Swift:プライベートメンバーを持つ抽象基本クラス/プロトコル
- 14. XMLの逆シリアル化は抽象クラスでは機能しません
- 15. Python - 抽象基本クラスをテストする
- 16. 抽象基本クラスを直列化しないASMX Webサービス
- 17. 属性を持つリストのXMLシリアル化
- 18. なぜNotImplementedメソッドを持つ通常のクラスの代わりに抽象基本クラスを使用しますか?
- 19. 汎用抽象クラスを指すには?
- 20. シリアル化可能クラスに含まれるオブジェクト型enumのシリアル化
- 21. 抽象テンプレートの基本クラスへのポインタ?
- 22. c#抽象基本クラスのプロパティ
- 23. Angular2 - TypeView基本抽象クラスの@ViewChild
- 24. Django、オートフィールドのない抽象基本クラス?
- 25. 基本クラスは抽象クラスであり、派生クラスも抽象クラスです。
- 26. C++での抽象基本クラスとテンプレートを使用したリファクタリング
- 27. MarshalByRefObjectフィールドを持つシリアライズ可能オブジェクト
- 28. 抽象基底クラスから子クラスのオブジェクトを返します
- 29. 汎用パラメータを持つ抽象クラスと型パラメータを使用するメソッド
- 30. テンプレートおよび/またはtypeof演算()を使用して抽象基本クラス型のオブジェクトをインスタンス化
@ドミトリーと同意します。あなたがXmlArrayItemAttributeを代わりに使うことができるAnimals要素を保つことができないなら、代わりの答えはXmlIncludeを使わないシリアライズhttp://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter