簡體   English   中英

XmlSerializer 無法反序列化使用相同序列化程序序列化的 XML

[英]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&#xC;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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM