2016-11-09 189 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); 
相關問題