我们使用DataContractSerializer
将我们的数据序列化为XML。最近我们发现了一个错误,说明字符串"\r\n"
被保存并回读 - 它变成了"\n"
。很显然,是什么原因导致这是使用XmlWriter
与Indent = true
集:如何正确地将只包含“ r n”的字符串序列化为XML?
// public class Test { public string Line; }
var serializer = new DataContractSerializer(typeof(Test));
using (var fs = File.Open("C:/test.xml", FileMode.Create))
using (var wr = XmlWriter.Create(fs, new XmlWriterSettings() { Indent = true }))
serializer.WriteObject(wr, new Test() { Line = "\r\n" });
Test test;
using (var fs = File.Open("C:/test.xml", FileMode.Open))
test = (Test) serializer.ReadObject(fs);
最明显的解决方法是停止缩进XML,并确实移除“XmlWriter.Create
”行使得Line
值往返正确,无论是"\n"
,"\r\n"
或还要别的吗。
然而,这样DataContractSerializer
写它似乎仍不是完全安全的或者甚至是正确的 - 例如,只是读与XML记事本生成的文件,并重新保存它会破坏双方"\n"
和"\r\n"
值完全。
这里的正确方法是什么?使用XML作为序列化二进制数据的一种有缺陷的概念?我们错误地期望像XML记事本这样的工具不会破坏我们的数据吗?我们是否需要增加每个可能包含具有某些特殊属性的文本的每个string
字段,可能是强制CDATA的内容?
所以,你会说使用DataContractSerializer并期望获得与您保存的完全相同的数据是一个错误? – 2009-08-23 11:52:48
我怀疑它不能被称为错误,直到您检查CDATA节是否处理它。换行符是一个边缘情况,因为显然系统中的换行符不一定与我的相同,所以我可以原谅这样的实现。我会尝试强制使用CDATA方法。 – 2009-08-23 11:56:59
找不到任何告诉DataContractSerializer使用CDATA的方法... – 2009-08-23 14:04:28