C# XmlReader ReadString()删除'\r';从「\r\n“;

C# XmlReader ReadString()删除'\r';从「\r\n“;,c#,winforms,xmlserializer,xml-deserialization,ixmlserializable,C#,Winforms,Xmlserializer,Xml Deserialization,Ixmlserializable,我有一个类继承自IXmlSerializable。我已经正确地重写了ReadXml和WriteXml方法 我正在使用XmlSerializer将对象序列化/反序列化为xml文件 当我序列化对象时,它正在正确地将\r\n写入文件。但是当我以同样的方式反序列化对象时,\r已被删除,并且只有\n存在。我不明白它为什么要这样做。只处理文本文件中新行的'\n'是正常的。DOS/Windows C库具有“文本模式”,可以透明地将CR-LF转换为LF并返回。它被称为规范化,并在 。。。XML处理器必须将解析实

我有一个类继承自
IXmlSerializable
。我已经正确地重写了
ReadXml
WriteXml
方法

我正在使用
XmlSerializer
将对象序列化/反序列化为xml文件


当我序列化对象时,它正在正确地将
\r\n
写入文件。但是当我以同样的方式反序列化对象时,
\r
已被删除,并且只有
\n
存在。我不明白它为什么要这样做。

只处理文本文件中新行的
'\n'
是正常的。DOS/Windows C库具有“文本模式”,可以透明地将CR-LF转换为LF并返回。

它被称为规范化,并在

。。。XML处理器必须将解析实体中的换行符规范化为#xA,方法是在解析之前将两个字符的序列#xD#xA和输入中未后跟#xA到#xA的任何#xD转换为#xA


某些规范化可以通过禁用。

那么为什么它会将
\r\n
写入文件?如果我只是从文件中读取文本,我会得到
\r\n
,但是如果我调用
XmlSerializer.Deserialize()
如果只读取
\n
。在Unix世界中,文本文件中的新行仅为
\n
。在Windows中,它是
\r\n
(CR-LF)。在Mac中,它仅为CR
\r
。但为了兼容性,当您在Windows下从C/C++中的文本文件读取时,所有
\r\n
-s都将转换为
\n
。通过这种方式,原始的Unix(控制台)程序可以在DOS/Windows下编译,它们必须工作。这是因为C语言“来自”Unix世界。请注意,这个问题是关于XML的:XML在新行处理方面有非常严格的规则。而对于一般的文本操作\r\n有点像您所说的那样,它们在或多或少随机生成/使用任意序列方面都是灵活的。另一方面,兼容的XML解析器仅限于根据规范始终公开
\n
,而不管源文本中有什么内容。因此,只要XML解析器是兼容的,在nix和Windows之间切换不会对*这个问题产生任何影响。您是对的,但事实上,即使没有任何新行,XML也将具有相同的“值”。所有标记都可以在一行。我没有使用
XmlTextReader
,所以这不是一个选项。当我调用
XmlSerializer.Deserialize()
并传递对象时,将调用对象的继承方法
IXmlSerializable.ReadXml(XmlReader reader)
。我试图在第一行编辑读卡器的设置,但settings属性为null,没有setter。我想找到一个解决方案,我可以把它放入我的
序列化程序
和/或
反序列化程序
方法中,以处理所有对象的序列化。但我猜我最好的选择是在需要的地方添加
。替换(“\n”,“\r\n”)
,除非这是个坏主意?如果不是
XmlTextReader
,你在使用什么?@Paul SGSPfINDE如果将
“\n”
重新规范化为
”\r\n“
,这可能是一个合理的选择。将正确配置的
XmlTextReader
作为源代码传递是另一种方法。。。XML存储任意字符串的格式非常糟糕。。。如果您必须保持字符串与提供的字符串完全相同,那么最好将其作为二进制数据处理并进行Base64编码。XML对0-32范围内的字符以及代理项对有非常严格的规则,所以请记住这一点。