类声明前的C#XML序列化属性

时间:2011-11-25 23:24:43

标签: c# xml xml-serialization dto

我有这个班级

public class dtoObject : CommonBase
{
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")]
    public List<dtoSomeItem> SomeItems
    {
        get { return _SomeItems; }
        set { _SomeItems = value; }
    }
 }

我希望使用XML Serialization使XML字符串显示为:

<Objects>
    <Object>
        <SomeItems>
            <SomeItem>
              1
            </SomeItem>
            <SomeItem>
              2
            </SomeItem>
        </SomeItems>
    </Object>
    <Object>
        <SomeItems>
            <SomeItem>
              3
            </SomeItem>
            <SomeItem>
              4
            </SomeItem>
        </SomeItems>
    </Object>
</Objects>

但对于我的生活,我无法弄清楚要放在什么之前

public class dtoObject

在属性方面,以便我得到

<Objects><Object>...</Object><Object>...

我序列化时。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我不认为您可以使用对象结构执行此操作,因为XML有效地声明了SomeItems集合的包装器。例如:

[XmlType("Objects")]
public class dtoObject : CommonBase
{
    [XmlElement("Object")]
    public List<dtoSomeItemWrapper> SomeItemsWrappers
    {
        get { return _SomeItemsWrappers; }
        set { _SomeItemsWrappers = value; }
    }
 }

class dtoSomeItemWrapper
{
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")]
    public List<dtoSomeItem> SomeItems
    {
        get { return _SomeItems; }
        set { _SomeItems = value; }
    }
}   

答案 1 :(得分:1)

这是我的工作。感谢comptent_tech和dthorpe的帮助。我这样创建了我的DTO:

[XmlType("Object", Namespace = "", TypeName = "Object")]
public class dtoObject : CommonBase   
{       
    [XmlArray("SomeItems"), XmlArrayItem("SomeItem")]       
    public List<dtoSomeItem> SomeItems       
    {
        get { return _SomeItems; }           
        set { _SomeItems = value; }       
    }    
}

我执行序列化的功能是:

public string ToXML(List<dtoObject> oObject)
{
    XmlDocument xmlDoc = new XmlDocument();
    XmlSerializer xmlSerializer = new XmlSerializer(oObject.GetType(), new XmlRootAttribute("Objects"));
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    using (MemoryStream xmlStream = new MemoryStream())
    {

        xmlSerializer.Serialize(xmlStream, oObject, ns);

        xmlStream.Position = 0;
        xmlDoc.Load(xmlStream);
        return xmlDoc.InnerXml;
    }
}

这样做会创建xml格式:

<?xml version="1.0"?>
    <Objects>
        <Object>
            <SomeItems>
                <SomeItem>
                </SomeItem>
            </SomeItems>
        </Object>
    <Objects>    

答案 2 :(得分:0)

你需要在类声明前面加XmlRootAttribute("Object", Namespace="", IsNullable=false)之类的东西。这告诉XML序列化程序使用<Object>标记来表示XML文本中的dtoObject。

对于<Objects>标记,除非您序列化dtoObject数组,否则不会得到它。这超出了dtoObject类型的范围。