不可打印字符的序列化

时间:2011-05-16 16:32:31

标签: c# .net serialization .net-4.0 xml-serialization

以下代码;

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位

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

非常感谢!

2 个答案:

答案 0 :(得分:12)

explained here有一种解决方法 - 您可以使用XmlReaderSettings.CheckCharacters选项忽略字符验证:

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

答案 1 :(得分:7)

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

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