2011-02-26 113 views
1

我試圖序列化一個對象到內存,將它作爲一個字符串傳遞給另一個進程,並反序列化它。XmlSerializer轉換換行

我發現XML序列化過程剝離了對象中字符串換行符的\ r。

byte[] b; 
// serialize to memory. 
using (MemoryStream ms = new MemoryStream()) 
{ 
    XmlSerializer xml = new XmlSerializer(this.GetType()); 
    xml.Serialize(ms, this); 
    b = ms.GetBuffer(); 
} 

// I can now send the bytes to my process. 
Process(b); 

// On the other end, I use: 
using (MemoryStream ms = new MemoryStream(b)) 
{ 
    XmlSerializer xml = new XmlSerializer(this.GetType()); 
    clone = (myObject)xml.Deserialize(ms); 
} 

如何序列化對象沒有它序列化到磁盤上就是這樣的,但沒有串重整新行?

+0

究竟哪些換行符被剝離? –

+0

在myObjcet中,我有幾個字符串,每個字符串都可以包含換行符。 – Jerry

+0

另外,你是否可以控制正在序列化的類?這兩個進程是否都運行.NET?如果是這樣,你有更好的選擇。 –

回答

0

答案來自ant so帖子,但我在這裏重新發布它,因爲我不得不稍微調整它。

我不得不創建一個新類來管理XML讀/寫到內存流。那就是:

public class SafeXmlSerializer : XmlSerializer 
{ 
    public SafeXmlSerializer(Type type) : base(type) { } 

    public new void Serialize(StreamWriter stream, object o) 
    { 
     XmlWriterSettings ws = new XmlWriterSettings(); 
     ws.NewLineHandling = NewLineHandling.Entitize; 

     using (XmlWriter xmlWriter = XmlWriter.Create(stream, ws)) 
     { 
      base.Serialize(xmlWriter, o); 
     } 
    } 
} 

因爲它是建立在XmlSerializer的頂部,它應該表現得完全如預期。只是當我用StreamWriter序列化時,我將使用序列化的「安全」版本,從而爲自己節約了頭痛。

我希望這可以幫助別人。

0

字符串應該包裝在CDATA部分以保留換行符。

+0

請注意,他將其對象序列化以生成XML - 您需要告訴他如何將字符串輸入到CDATA部分。 –