对象的C#XML序列化,该对象具有不带命名空间的对象字段

本文关键字:对象 命名空间 字段 C#XML 序列化 | 更新日期: 2023-09-27 18:22:47

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

要序列化的My对象;

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>

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

对象的C#XML序列化,该对象具有不带命名空间的对象字段

为了能够反序列化Payload属性,type属性是必需的;如果序列化程序不知道内容的类型,它如何反序列化它?

通常情况下,名称空间会添加到根元素中,但您通过使用空映射指定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的类型以进行反序列化。