使用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bla</string>
对Deserialize
的调用失败。
这似乎是XmlSerializer
中的一个错误,因为序列化的字符串似乎很好。或者我做错了什么?
答案 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中允许无效字符,而且有些消费者可能没有选择这样做。