2016-11-09 185 views
0

我想创建一个泛型类,我将用于XML序列化。 我用来保存通用对象T的属性被称为“消息”,但我希望创建的此属性的XML节点的名称是我在类ElementType上标注的。Xml序列化使用XmlElement的泛型类型名称 - C#

实施例:

public class MessageWrapper<T>where T : class 
{ 
    [XmlElement] 
    public T Message { get; set; } 
} 

对象类我想举行Message属性 -

[XmlType("Connect"), Serializable] 
public class ConnectMessage 
{ 
    [XmlElement("Machine_Name")] 
    public string MachineName { get; set; } 

    [XmlElement("Application_Name")] 
    public string AppName { get; set; } 
} 

输出XML现在是这样的 -

<Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Message_ID>1</Message_ID> 
    <Message> 
    <Machine_Name>WS-8193</Machine_Name> 
    <Application_Name>TestApplication</Application_Name> 
    </Message> 
</Message> 

此相反:

<Message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Message_ID>1</Message_ID> 
    <Connect> 
    <Machine_Name>WS-8193</Machine_Name> 
    <Application_Name>TestApplication</Application_Name> 
    </Connect> 
</Message> 

这可能吗?

+0

请注意,沿着同一个计划,您的所有其他属性必须命名为'' –

回答

1

除了你的通用方法,我有一个工厂方法。无论哪种方式,你必须依靠XmlAttributeOverrides

public interface IMessage {} 
public class AbstractMessage : IMessage { } 
// your generic 
public class MessageWrapper<T> where T : IMessage { public T Message { get; set; } } 
// my factory 
[XmlInclude(typeof(ConnectMessage))] 
public class MessageWrapper { public AbstractMessage Message { get; set; } } 
// overrides 
public static class MessageWrapperTester { 
    public static XmlAttributeOverrides XmlOverrides { 
     get { 
      var xmlOverrides = new XmlAttributeOverrides(); 
      var attr = new XmlAttributes(); 
      attr.XmlElements.Add(new XmlElementAttribute("Connect", typeof(ConnectMessage))); 
      xmlOverrides.Add(typeof(MessageWrapper), "Message", attr); 
      xmlOverrides.Add(typeof(MessageWrapper<>), "Message", attr); 
      xmlOverrides.Add(typeof(MessageWrapper<ConnectMessage>), "Message", attr); 
      return xmlOverrides; 
     } } } 
// use it like, generic 1st, factory 2nd: 
var srlz = new XmlSerializer(typeof(MessageWrapper<ConnectMessage>), MessageWrapperTester.XmlOverrides); 
var srlz = new XmlSerializer(typeof(MessageWrapper), MessageWrapperTester.XmlOverrides); 
相关问题