带有C#信封的对象的XML序列化

我需要在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>

如果我指定一个动物实例,我想得到

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

如何使用属性覆盖来处理此问题?

解决方法

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

这是一个粗略的未经测试的片段,但应指向正确的方向:

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...