C# 不可打印字符的序列化

C# 不可打印字符的序列化,c#,.net,serialization,.net-4.0,xml-serialization,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(serializ

以下代码

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));
在.NET4中引发此异常

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

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


非常感谢

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

另一方面,此类字符(空格前的ASCII字符,而不是制表符、回车符和换行IIRC)的实际使用相对较少-您可能会发现您可以将它们去掉。另一种方法是使用您自己的转义,或者将整个字符串编码为二进制,并以base64作为结果。转义比重新编码方法占用的空间要小得多:)

有一个解决方法,因为您可以使用选项忽略字符验证:

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

是的,如果您正处于这些字符非常重要的位置,那么是时候停止将其视为文本了。它是二进制的。谢谢@JonSkeet,为了以防万一,我正在尝试序列化一个对象,其中包含一个字符串字段中的标准。它们使用SOH/(char)1作为分隔符。我理解你关于这是无效XML的观点,但这只是一个小的辅助项目,所以我将务实地使用下面的方法。谢谢+1因为我没有意识到这一点,但我认为值得强调的是,最终将使用无效的XML。如果数据管道中的任何其他内容依赖于有效的XML,它将中断。