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

发布于 2024-12-18 05:56:42 字数 1065 浏览 2 评论 0原文

我有这个类

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

,我想使用 XML 序列化来使 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>...

当我序列化它时我就得到了。

有什么想法吗?

I have this class

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

and I would would like to use XML Serialization to make the XML string appear to be:

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

But for the life of me I cant figure out what to put before

public class dtoObject

in terms of Attributes, so that I get

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

when I serialize this.

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

酒中人 2024-12-25 05:56:42

我认为您不能使用对象结构来执行此操作,因为 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; }
    }
}   

I don't think that you can do this with your object structure because the XML effectively declares a wrapper around the SomeItems collection. For example:

[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; }
    }
}   
情绪操控生活 2024-12-25 05:56:42

这就是我要做的工作。感谢 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>    

Here is what I got to work. Thanks to comptent_tech and dthorpe for their help. I created my DTO like so:

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

My function that does the serializing is this:

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

Doing this creates the xml format of:

<?xml version="1.0"?>
    <Objects>
        <Object>
            <SomeItems>
                <SomeItem>
                </SomeItem>
            </SomeItems>
        </Object>
    <Objects>    
寄与心 2024-12-25 05:56:42

您需要在类声明前面添加类似 XmlRootAttribute("Object", Namespace="", IsNullable=false) 的内容。这告诉 XML 序列化程序使用 标记来表示 XML 文本中的 dtoObject。

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

You'll need something like XmlRootAttribute("Object", Namespace="", IsNullable=false) in front of the class declaration. That tells the XML serializer to use the <Object> tag to represent the dtoObject in the XML text.

As for the <Objects> tag, you won't get that unless you are serializing an array of dtoObject. That is beyond the scope of the dtoObject type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文