【问题标题】:Xml Serialization using the XmlElement name of the generic type - C#使用泛型类型的 XmlElement 名称进行 Xml 序列化 - C#
【发布时间】:2016-11-09 08:07:54
【问题描述】:

我正在尝试创建一个用于 XML 序列化的通用类。 我用来保存通用对象 T 的属性称为“消息”,但我希望创建的该属性的 XML 节点按照我在 ElementType 类上的注释命名。

例子:

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>

这可能吗?

【问题讨论】:

  • 请注意,按照相同的方案,您的所有其他属性都必须命名为&lt;String &gt;

标签: c# xml generics serialization


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多