![](/img/trans.png)
[英]Cannot deserialize previously serialized XML with c# xmlserializer
[英]XmlSerializer cannot deserialize XML that was serialized with the same serializer
我在使用 XML Serializer 時遇到了一個奇怪的問題。 如果序列化對象圖包含帶有表單饋送 (0x0C) 的字符串,則序列化程序可以正確地對其進行序列化,但無法反序列化序列化的表示形式。
這是概念證明:
static void Main (string[] args)
{
var original = "test\fbla";
var stringBuilder = new StringBuilder ();
using (var writer = new StringWriter (stringBuilder))
{
new XmlSerializer (typeof (string)).Serialize (writer, original);
}
var serialized = stringBuilder.ToString ();
string deserialized;
using (var reader = new StringReader (serialized))
{
deserialized = (string) new XmlSerializer (typeof (string)).Deserialize (reader);
}
Console.WriteLine (deserialized);
}
序列化的字符串是:
<?xml version="1.0" encoding="utf-16"?>
<string>testbla</string>
對Deserialize
的調用失敗。 這似乎是XmlSerializer
一個錯誤,因為序列化的字符串似乎格式良好。 還是我做錯了什么?
該字符在 XML 中從技術上講是無效的(一個很好的問題是作者為什么不拋出此異常......查看參考源,它使用XmlTextWriter
而不是XmlWriter
,我認為默認情況下它不檢查字符? )。 你需要給序列化程序一個XmlReader
被告知不要檢查字符:
string deserialized;
XmlReaderSettings settings = new XmlReaderSettings();
// this will make the reader not barf on invalid characters
settings.CheckCharacters = false;
// can't just use a string reader here, otherwise the Serializer
// will use an XmlReader with default settings
using (var reader = XmlReader.Create(new StringReader(serialized), settings))
{
deserialized = (string)new XmlSerializer(typeof(string)).Deserialize(reader);
}
但是 - 如果您需要序列化可能/肯定包含 XML 中無效字符的字符串,您應該考慮使用不同的序列化格式( BinaryFormatter
、 JSON 或 Protocol Buffers 都取決於您的要求/消費者)。 沒有好的方法可以保證您的下游使用者知道他們必須允許 XML 中的無效字符,而且某些使用者可能無法選擇這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.