C# XmlSerializer无法反序列化使用同一序列化程序序列化的XML

C# XmlSerializer无法反序列化使用同一序列化程序序列化的XML,c#,xml-serialization,C#,Xml Serialization,我在使用XML序列化程序时遇到了一个奇怪的问题。 如果序列化对象图包含带有表单提要(0x0C)的字符串,则序列化程序可以对其进行正确序列化,但无法反序列化序列化的表示形式 以下是概念证明: static void Main (string[] args) { var original = "test\fbla"; var stringBuilder = new StringBuilder (); using (var writer = new StringWriter (stri

我在使用XML序列化程序时遇到了一个奇怪的问题。 如果序列化对象图包含带有表单提要(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>

测试;布拉
调用
反序列化
失败。
这似乎是
XmlSerializer
中的一个bug,因为序列化的字符串似乎格式良好。还是我做错了什么?

该字符在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 < /COD>,JSON,或协议缓冲区,这取决于您的需求/消费者)。没有好的方法可以保证下游用户知道他们必须允许XML中的无效字符,有些用户可能没有这样做的选择。

只是检查一下,它是否能在没有表单提要的情况下工作?你能提供关于<代码>反序列化< /代码>失败的额外细节吗?很乐意帮助。如果这解决了你的问题,请考虑标记复选框以帮助将来的用户更容易找到它。