不可打印字符的序列化

本文关键字:序列化 字符 打印 | 更新日期: 2023-09-27 17:56:40

以下代码;

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));

在 .NET 4 中引发此异常。

无效操作异常 - XML 文档 (2, 12) 中出现错误。'',十六进制值0x01,是一个无效字符。第 2 行,位置 12

我做错了什么吗?还是有合理的解决方法?

非常感谢!

不可打印字符的序列化

有一个解决方法,如此处所述 - 您可以使用XmlReaderSettings.CheckCharacters选项忽略字符验证:

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

您正在尝试序列化无法在 XML 中表示的字符。不幸的是,它们破坏了 XML 序列化。除了编写自己的转义代码之外,我不知道任何解决方法。

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