【问题标题】:C# XML Serialisation of Object that has an Object field without namespaces具有没有命名空间的对象字段的对象的 C# XML 序列化
【发布时间】:2013-07-17 15:58:47
【问题描述】:

我正在尝试将对象序列化为具有“对象”字段的 XML。我想实现没有名称空间或属性的 XML。我可以删除根元素的命名空间,但是,Object 元素仍然具有命名空间。

我要序列化的对象;

public class Message {
        public String Metadata { get; set; }
        public Object Payload { get; set; }


        public Message() {
        }

        public Message(String Metadata, Object Payload) {
            this.Metadata = Metadata;
            this.Payload = Payload;
        }
    }

我如何序列化;

var s = new System.Xml.Serialization.XmlSerializer(typeof(Message));
var ns = new System.Xml.Serialization.XmlSerializerNamespaces();
ns.Add(String.Empty, String.Empty);
StringWriter writer = new StringWriter();
s.Serialize(writer, payload, ns);
writer.Close();

我的输出:

<Message>
  <Metadata>myMetadata</Metadata>
  <Payload xmlns:q1="http://www.w3.org/2001/XMLSchema" d2p1:type="q1:string" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance">myPayload</Payload>
</Message>

我的理想输出:

<Message>
  <Metadata>myMetadata</Metadata>
  <Payload>myPayload</Payload>
</Message>

我是一名 Java 开发人员,这是我做 C# 的第一天!如果我遗漏了任何明显的东西,请道歉。

(我的主要目标是最终得到以下输出)

<Message>
  <Metadata>myMetadata</Metadata>
  <Payload class="aClass">myPayload</Payload>
</Message>

但是,一旦我找到了上述问题的解决方案,我就可以自己研究一下!

【问题讨论】:

  • 我想向 Java 发送一个 c# 对象。我可以在 Java 中很好地获取元数据,但是“有效负载”的序列化,因为它是“对象”类型,无法在 Java 中正确地反序列化。例如,当向 Java 发送 new Message("myMD", "myPL") 时,我的 Java 方法 getMetadata() 返回“myMD”,而 getPayload() 返回 java.lang.Object@343dsds - 而不是“myPL”
  • 这与命名空间有什么关系? Java 根本不会理解 Object。

标签: c# xml xml-serialization


【解决方案1】:

type 属性是必需的,以便能够反序列化 Payload 属性;如果序列化器不知道内容的类型,如何反序列化呢?

通常命名空间会添加到根元素,但您通过指定带有空映射的XmlSerializerNamespaces 明确阻止了这种情况,因此命名空间被添加到Payload 元素上。

如果你使用XmlSerializer,你能做的最好的就是:

<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Metadata>myMetadata</Metadata>
  <Payload xsi:type="xsd:string">myPayload</Payload>
</Message>

现在,您当然可以手动生成 XML,无需任何命名空间,但是您需要通过某种方式了解 Payload 的类型以进行反序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    相关资源
    最近更新 更多