2

以下のクラス構造を検討してください

[XmlInclude(typeof(DerivedClass))]
public class BaseClass
{
    public string mem1;
    public string mem2;
}

public class DerivedClass : List<BaseClass>
{
    public string mem3;
    public string mem4;
}

class Program
{
    static void Main(string[] args)
    {
        DerivedClass obj = new DerivedClass();
        obj.mem3 = "test3";
        obj.mem4 = "test4";
        BaseClass base11 = new BaseClass();
        base11.mem1 = "test1";
        base11.mem2 = "test2";
        obj.Add(base11);
        XElement
           .Parse(XMLSerializerUtil.GetXMLFromObject(obj))
           .Save(@"C:\new_settings1.xml");
    }
}

与えられた GetXMLFromObject のコードは以下のとおりです

public static string GetXMLFromObject(object instance)
{
        string retVal = string.Empty;
        if (instance != null)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(instance.GetType());
            using (MemoryStream memoryStream = new MemoryStream())
            {
                xmlSerializer.Serialize(memoryStream, instance);
                memoryStream.Position = 0;
                retVal = new StreamReader(memoryStream).ReadToEnd();
            }
        }
        return retVal;
    }

属性を追加した後でもXmlInclude、生成された XML ファイルに、派生クラス メンバーが存在しません。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfBaseClass xmlns:xsd="http://www.w3.org/2001/XMLSchema"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <BaseClass>
        <mem1>test1</mem1>
        <mem2>test2</mem2>
    </BaseClass>
</ArrayOfBaseClass>

生成された XML ファイルに派生クラス メンバーを含めるために不足しているものを教えてください。

4

1 に答える 1

3

問題は次のとおりです。

DerivedClass : List<BaseClass>

の場合XmlSerializer、項目は排他的リストまたはエンティティのいずれかです。リストのように見える場合は、リスト項目のみがシリアル化されます。「リスト」自体のメンバーはシリアル化されません。基本的に、それをしないでください。リストから派生する代わりに、リストをカプセル化します。

[XmlInclude(...)]また、が期待されることに注意してくださいDerivedClass : BaseClass。したがって、次のようなものです:

public class SomeType // note DOES NOT INHERIT
{
    private readonly List<SomeOtherType> items = new List<SomeOtherType>();
    public List<SomeOtherType> Items { get { return items; } }
    [XmlElement("mem3")] public string Mem3 {get;set;}
    [XmlElement("mem4")] public string Mem4 {get;set;}
}

public class SomeOtherType
{
    [XmlElement("mem1")] public string Mem1 {get;set;}
    [XmlElement("mem2")] public string Mem2 {get;set;}
}
于 2013-05-13T08:25:36.060 に答える