【问题标题】:xml serializing a list of base classxml序列化基类列表
【发布时间】:2013-05-13 08:20:17
【问题描述】:

考虑下面的类结构

[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 文件中包含派生类成员缺少什么。

【问题讨论】:

    标签: c# xml-serialization xmlserializer


    【解决方案1】:

    问题来了:

    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;}
    }
    

    【讨论】:

    • 感谢您的帮助。将基类包含为列表后,我得到的 xml 如下。 test1test2 但我需要 XML 作为 w3.org/2001/XMLSchema" xmlns:xsi ="w3.org/2001/XMLSchema-instance"> test1test2test11test21
    • @prabna 如果您需要匹配特定的 xml 布局,也可以这样做 - 只需添加正确的属性。如果你能显示xml,我会告诉你你需要什么
    • 感谢您的帮助。在我将基类作为列表包含在派生类中之后。 test1test2test11test21 BaseClass> 但我需要它如下。 test1test2test11test21
    • @prabna 然后在列表前添加[XmlElement("BaseClass")]
    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2014-12-13
    相关资源
    最近更新 更多