【问题标题】:Custom XML serialization - Include class name自定义 XML 序列化 - 包括类名
【发布时间】:2012-02-09 19:18:46
【问题描述】:

我在关注以下 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>

还有:

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

如上所示,我希望内部主体包含类名&lt;ExampleObject&gt;

我使用泛型,因为我需要有不同的消息体,我用代码序列化:

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

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

【问题讨论】:

  • 要做到这一点而不实现 IXmlSerializable 将需要更改对象模型并使用 XmlAttributeOverrides - 可行但并非微不足道。我目前不在 PC 上,但可能稍后再看。我想知道直接写一个 DOM 会不会更容易...
  • 仅供参考,XML 序列化程序不使用“[Serializable]”。

标签: c# .net xml serialization xml-serialization


【解决方案1】:

正如@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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多