2010-10-04 62 views
3

我有什麼必須是數據協定序列化程序非常嚴重的問題。它拒絕工作。我只是想將一個對象序列化成一個XmlDocument,但是我似乎正在撞牆。DataContractSerializer - 問題

這裏是datacontracts我想連載:

[DataContract(Namespace="urn://test", Name = "ServiceFault1")] 
public class ServiceFault 
{ 
    [DataMember()] 
    public int hello { get; set; } 

    [DataMember()] 
    public List<Error> Errors {get; set;} 
} 

[DataContract(Namespace = "urn://test", Name = "Error1")] 
public class Error 
{ 
    [DataMember()] 
    public string ErrorCategoryCode { get; set; } 

    [DataMember()] 
    public string LocalErrorCode { get; set; } 

    [DataMember()] 
    public string Description { get; set; } 
} 

而任何序列化的方法;

public static XmlDocument Serialize(ServiceFault toSer) 
    { 
     DataContractSerializer ser = new DataContractSerializer(toSer.GetType()); 

     MemoryStream mem = new MemoryStream(); 
     ser.WriteObject(XmlWriter.Create(mem), toSer); 

     XmlDocument tmp = new XmlDocument(); 
     mem.Seek(0, SeekOrigin.Begin); 
     tmp.Load(mem); 

     return tmp; 
    } 

每當我調用serialize方法時,內存流總是空的。我也嘗試過一個字符串生成器,只是爲了看看是否有任何東西出來。

如果我使用XmlSerializer這個工作,但我想了解爲什麼地球上的代碼不起作用?爲什麼序列化程序總是空的?

感謝您的幫助! TM

+1

在您的通話.WriteObject,只是傳入流(如「mem」) - 不要創建一個XmlWriter:'ser.WriteObject(mem,toSer);' – 2010-10-04 19:44:01

+0

@marc_s,它會改變什麼? WriteObject將在內部創建一個XwlWriter ... – 2010-10-04 19:50:16

+0

@Thomas Levesque:在我的情況下,**帶有** XmlWriter,它沒有工作,沒有 - 它的工作完美...去圖... – 2010-10-04 20:19:17

回答

4

這是我用來序列化我的對象的代碼,它似乎適用於我。另外我認爲DataContract屬性不是必需的,我只在一個地方使用屬性來忽略成員。

DataContractSerializer serializer = new DataContractSerializer(toSers.GetType()); 
MemoryStream ms = new MemoryStream(); 
serializer.WriteObject(ms, toSer); 
ms.Position = 0; 

string serializedContent; 
using(StreamReader sr = new StreamReader(ms)) 
{ 
    serializedContent = sr.ReadToEnd(); 
} 

我看到的區別是,我直接寫入MemoryStream的,位置設置爲0 ,而不是調用seek()。

如果需要,可以將結果字符串加載到XmlDocument中,在實例上使用XmlDocument.LoadXml。

+0

ms.Position = 0 .....謝謝! – 2012-03-13 00:53:42

3

問題在於以下行,因爲XMLWriter還有沒有刷新它的內容到內存流尚未:

ser.WriteObject(XmlWriter.Create(mem), toSer); 

嘗試,而不是使用:

public static XmlDocument Serialize(ServiceFault toSer) 
{ 
    DataContractSerializer ser = new DataContractSerializer(toSer.GetType()); 
    XmlDocument tmp = new XmlDocument(); 
    using (MemoryStream mem = new MemoryStream()) 
    { 
     using (var memWriter = XmlWriter.Create(mem)) 
     { 
      ser.WriteObject(memWriter, toSer); 
     } 

     mem.Seek(0, SeekOrigin.Begin); 
     tmp.Load(mem); 
    } 
    return tmp; 
}