【问题标题】:XML serialization of objects with envelope in C#C#中带有信封的对象的XML序列化
【发布时间】:2011-08-19 05:41:23
【问题描述】:

我需要在 C# 中将对象序列化为 XML。物品应包裹在信封中。为此,我创建了以下 Envelope 类:

[XmlInclude(typeof(Person))]
public class Envelope
{
    public string SomeValue { get; set; }
    public object WrappedObject { get; set; }
}

我使用以下代码序列化类:

string fileName = ...;
XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
TextWriter textWriter = new StreamWriter(fileName);
try
{
    serializer.Serialize(textWriter, <instance of envelope>);
}
finally
{
    textWriter.Close();
}

当我将 Person 类型的对象分配给 WrappedObject 时,我得到以下 XML:

<Envelope>
    <SomeValue>...</SomeValue>
    <WrappedObject xsi:type="Person">
        ....
    </WrappedObject>
</Envelope>

问题是,我希望包装对象的标签以我传入的实际类命名。例如,如果我将Person 的实例分配给WrappedObject,我想要XML 如下所示:

<Envelope>
    <SomeValue>...</SomeValue>
    <Person>
        ....
    </Person>
</Envelope>

如果我分配Animal 的实例,我想得到

<Envelope>
    <SomeValue>...</SomeValue>
    <Animal>
        ....
    </Animal>
</Envelope>

我将如何实现这一目标?

编辑

其实我已经稍微简化了我的例子……被包裹的对象实际上又被包裹了:

public class Envelope
{
    public string SomeValue { get; set; }
    public Wrapper Wrap { get; set; }
}

[XmlInclude(typeof(Person))]
public class Wrapper
{
    public object WrappedObject { get; set; }
}

我将如何使用属性覆盖来处理这个问题?

【问题讨论】:

    标签: c# xml serialization xml-serialization


    【解决方案1】:

    您需要使用attribute override。我正在使用它大量,因为我做了很多自定义序列化。

    这是一个粗略的未经测试的 sn-p,但应该为您指明正确的方向:

    XmlAttributes attributes = new XmlAttributes();
    XmlAttributeOverrides xmlAttributeOverrides = new XmlAttributeOverrides();
    attributes.XmlElements.Add(new XmlElementAttribute("Person", t));
    xmlAttributeOverrides.Add(typeof(Person), "WrappedObject", attributes);
    XmlSerializer myserialiser = new XmlSerializer(typeof(Envelope), xmlAttributeOverrides);
    

    【讨论】:

    • 好的,我知道这是如何工作的,但我必须承认我已经稍微简化了我的示例 ;-) 你介意看看我上面的修改版本吗?
    • 相同的代码应该可以工作。你甚至不需要XmlInclude
    • 嗯,当我剥离 XmlInclude 时,我得到一个异常,上面写着“意外类型...,使用 XmlInclude 或 SoapInclude...”。
    • 好的,您也许可以使用XmlAttributeOverrides 本身添加XmlInclude 并使其更整洁。
    • 糟糕,我复制/粘贴了您的代码,并且在属性名称 WrappedObject 之后多了一个“空格”字符。我不小心把它留在里面了。当我删除它时,一切都按预期工作!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多