我正在尝试将Object序列化为具有“Object”字段的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>
但是一旦我找到了上述问题的解决方案,我就可以自己调查一下!
答案 0 :(得分:3)
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
类型。