不可打印字符的序列化

Cit*_*iew 13 .net c# serialization xml-serialization .net-4.0

以下代码;

var c = (char) 1;

var serializer = new XmlSerializer(typeof (string));

var writer = new StringWriter();
serializer.Serialize(writer, c.ToString()); 
var serialized = writer.ToString();

var dc = serializer.Deserialize(new StringReader(serialized));
Run Code Online (Sandbox Code Playgroud)

在.NET 4中引发此异常.

无效的操作异常 - XML文档中存在错误(2,12).'',十六进制值0x01,是无效字符.第2行,第12位

难道我做错了什么?或者有合理的解决方法吗?

非常感谢!

mel*_*okb 12

这里解释了一种解决方法- 您可以使用XmlReaderSettings.CheckCharacters选项忽略字符验证:

XmlReader xr = XmlReader.Create(new StringReader(serialized),
    new XmlReaderSettings { CheckCharacters = false });
var dc = (string)serializer.Deserialize(xr);
Run Code Online (Sandbox Code Playgroud)

  • +1,因为我不知道它,但我认为值得强调的是,你最终会得到无效的XML.如果数据管道中的任何其他内容依赖于有效的XML,它将会中断. (2认同)

Jon*_*eet 7

您正在尝试序列化无法在XML中表示的字符.不幸的是他们打破了XML序列化.除了编写自己的转义代码之外,我不知道除此之外的任何变通方法.

另一方面,这些字符的实际用途(空格前的ASCII字符,除标签,回车和换行IIRC之外)相对较少 - 你可能会发现你可以剥离它们.替代方法是提出自己的转义,或者将整个字符串编码为二进制和base64结果.转义将比重新编码方法占用更少的空间:)

  • 是的,如果您处于这些字符很重要的位置,则应该停止将其视为文本.这是二进制的. (3认同)