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

时间:2016-03-23 20:25:30

标签: c# xml-serialization

使用XML Serializer我有一个奇怪的问题。 如果序列化对象图包含带有Form-Feed(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中的一个错误,因为序列化的字符串似乎很好。或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

该字符在XML中在技术上无效(一个很好的问题是作者没有抛出此异常的原因...查看参考源,它使用XmlTextWriter而不是{{1} },我认为默认情况下不检查字符?)。你需要给序列化器一个XmlWriter,告诉他们不要检查字符:

XmlReader

但是 - 如果您需要序列化可能/肯定包含XML中无效字符的字符串,则应考虑使用不同的序列化格式(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); } ,JSON或协议缓冲区根据您的要求/消费者)。没有什么好方法可以保证您的下游消费者不会知道他们必须在XML中允许无效字符,而且有些消费者可能没有选择这样做。