2013-07-17 32 views
2

我想將對象序列化爲具有'對象'字段的XML。我想實現沒有名稱空間或屬性的XML。我能夠刪除根元素的名稱空間,但是,Object元素仍然有一個名稱空間。具有對象字段沒有命名空間的對象的C#XML序列化

我的對象序列化;

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

爲什麼沒有命名空間? –

+1

我想發送一個C#對象到Java。我可以很好地將元數據返回到Java中,但是'Payload'的序列化,因爲它是'Object'類型,所以無法正確地在Java中反序列化。例如,向Java發送新消息(「myMD」,「myPL」)時,我的Java方法getMetadata()返回「myMD」,getPayload()返回[email protected] - 不是「myPL」 –

+0

那是什麼必須處理命名空間? Java根本就不會理解Object。 –

回答

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

相關問題