2012-01-13 106 views
4

以下XML序列化输出后我:自定义XML序列化 - 包括类名

<?xml version="1.0"?> 
<Message> 
    <Version>1.0</Version> 
    <Body> 
    <ExampleObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <EmampleOne>Hello!</EmampleOne> 
    </ExampleObject> 
    </Body> 
</Message> 

我有以下类别:

[Serializable] 
    public class Message<T> 
    { 
     public string Version { get; set; } 
     public T Body { get; set; } 
    } 

[Serializable] 
public class ExampleObject 
{ 
    public string EmampleOne { get; set; } 
} 

如果我序列分开他们,我得到:

<?xml version="1.0"?> 
<Message> 
    <Version>1.0</Version> 
    <Body> 
    <EmampleOne>Hello!</EmampleOne> 
    </Body> 
</Message> 

And:

<?xml version="1.0"?> 
<ExampleObject> 
    <EmampleOne>Hello!</EmampleOne> 
</ExampleObject> 

因此,如上所示,我想要内部身体包含类名<ExampleObject>

我使用仿制药,我需要有不同的邮件正文的,序列化的代码:

var obj = new Message<ExampleObject> 
{ 
    Version = "1.0", 
    Body = example 
}; 

var serializer2 = new XmlSerializer(typeof (Message<ExampleObject>)); 
+0

要这样做没有实现IXmlSerializable将需要更改对象模型,并使用XmlAttributeOverrides - 可以做到但不是微不足道的。我目前不在PC上,但稍后可能会看。我想知道是否直接编写DOM会更容易... – 2012-01-13 17:38:23

+0

仅供参考,XML序列化程序不使用“[Serializable]”。 – 2012-01-13 20:32:22

回答

3

由于@Marc Gravell在他的评论所说,你可以使用XmlAttributeOverrides

var xmlOverrides = new XmlAttributeOverrides(); 
var attributes = new XmlAttributes(); 
attributes.XmlElements 
    .Add(new XmlElementAttribute("ExampleObject", typeof (ExampleObject))); 
xmlOverrides.Add(typeof(Message<ExampleObject>), "Body", attributes); 

var serializer2 = new XmlSerializer(typeof(Message<ExampleObject>), xmlOverrides);