C# XmlSerializer无法反序列化使用同一序列化程序序列化的XML
我在使用XML序列化程序时遇到了一个奇怪的问题。 如果序列化对象图包含带有表单提要(0x0C)的字符串,则序列化程序可以对其进行正确序列化,但无法反序列化序列化的表示形式 以下是概念证明: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
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>
测试;布拉
调用反序列化
失败。
这似乎是
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中的无效字符,有些用户可能没有这样做的选择。
只是检查一下,它是否能在没有表单提要的情况下工作?你能提供关于<代码>反序列化< /代码>失败的额外细节吗?很乐意帮助。如果这解决了你的问题,请考虑标记复选框以帮助将来的用户更容易找到它。