2013-06-25 21 views
0

我一直在對這個問題進行一番討論。這似乎是一個簡單的解決方案,但我已經搜索了互聯網,並嘗試了很多事情。使用「 n」反序列化字符串列表會導致出現空字符串

我有一個複雜的對象,其中包含一個字符串列表,需要序列化到XML然後反序列化。

序列化代碼早已成爲應用程序的一部分,可以在無數其他場景下工作,但這裏的問題似乎是字符串列表中的一個元素僅僅是一個新行字符(即「\ n」) 。

這是我的理解,根據我的研究,它按預期進行序列化(見下文),但反序列化後元素包含一個空字符串(即「」)而不是「\ n」。

這裏是代碼...

public DoStuff(ItemTypeObj item) 
{ 
    string myItem = XmlSerialize<ItemType>(item); 
    ItemTypeObj myNewItemTypeObj = XmlDeserialize<CustomItem>(myItem) 
} 

public static string XmlSerialize<T>(T objectToSerialize) 
{ 
    string ret = string.Empty; 

    XmlSerializer s = new XmlSerializer(typeof(T)); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     s.Serialize(ms, objectToSerialize); 
     ms.Position = 0; 
     using (StreamReader sr = new StreamReader(ms)) 
     { 
      sRet = sr.ReadToEnd(); 
     } 
    } 
    return ret; 
} 

public static T XmlDeserialize<T>(string serializedObject) 
{ 
    T retVal = default(T); 
    byte[] ba = ASCIIEncoding.UTF8.GetBytes(serializedObject); 
    using (MemoryStream ms = new MemoryStream(ba)) 
    { 
     XmlSerializer s = new XmlSerializer(typeof(T)); 

     retVal = (T)s.Deserialize(ms);    
    } 
    return retVal; 
} 

給你發送的數據中的一個想法,ItemTypeObj是包含一個字符串列表中的對象。該字符串列表可以是變長,但樣本數據看起來是這樣的......

[0] = "Zero element text \n" 
[1] = "[element1]" 
[2] = "\n" 
[3] = "[element3]" 
[4] = "\n" 
[5] = "[element5]" 

連載時它看起來這樣的(這似乎是正確的我):

<Text> 
    <string>Zero element text 
</string> 
    <string>[element1]</string> 
    <string> 
</string> 
    <string>[element3]</string> 
    <string> 
</string> 
    <string>[element5]</string> 
<Text> 

從我」已經閱讀的換行符在上面的xml中表現得如預期。問題是它反序列化的字符串列表後是這樣的:

[0] = "Zero element text \n" 
[1] = "[element1]" 
[2] = "" 
[3] = "[element3]" 
[4] = "" 
[5] = "[element5]" 

只有在這也有文本的元素換行字符(例如,[0])仍然存在。其他兩個替換爲空字符串。如果我向這些元素添加文本,新行將被保留。

查看反序列化中的字節數組,其中「\ n」變成了10(又名LF,新行)的序列化字符串中位置的數組元素。然後在反序列化中沒有成功轉化爲「\ n」。也許這個問題太多了。

任何見識將不勝感激。謝謝。

回答

2

您需要使用XmlReaderXmlWriter類或DataContractSerializer

參見:How to keep XmlSerializer from killing NewLines in Strings?

public static string XmlSerialize<T>(T objectToSerialize) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 

    var settings = new XmlWriterSettings 
         { 
          NewLineHandling = NewLineHandling.Entitize 
         }; 

    using(var stream = new StringWriter()) 
    using(var writer = XmlWriter.Create(stream, settings)) 
    { 
     s.Serialize(writer, objectToSerialize); 

     return stream.ToString(); 
    } 
} 

public static T XmlDeserialize<T>(string serializedObject) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 

    using(var stream = new StringReader(serializedObject)) 
    using(var reader = XmlReader.Create(stream)) 
    { 
     return (T)s.Deserialize(reader); 
    } 
} 

用法:

public class Foo 
{ 
    public string Bar { get; set; } 
} 

var foo = new Foo { Bar = "\n" }; 
var result = XmlSerialize(foo); 

Console.WriteLine(result); 

var newFoo = XmlDeserialize<Foo>(result); 

Console.WriteLine(newFoo.Bar); 
Debug.Assert(newFoo.Bar == "\n"); 
+0

感謝。這似乎工作,雖然xml字符串是未格式化的。任何人都可以解釋爲什麼原始代碼只刪除新行,如果它是list元素中的_only_事物?這就是爲什麼我看到的鏈接似乎不適用於我。 – John

+0

序列化程序刪除換行符,因爲它不認爲它是數據。 – Romoku

+0

@Romuku - 在我的評論中,這不是對問題的真正解釋。 :)另外,只有我的代碼中的反序列化方法無法按照需要的方式工作。我可以得到我想要的只是用反序列化來代替我的反序列化。所以這很複雜。 – John