C# XmlSerializer将CR-LF反序列化为LF

C# XmlSerializer将CR-LF反序列化为LF,c#,xmlserializer,xml-deserialization,C#,Xmlserializer,Xml Deserialization,可能重复: 我有一个类,上面有一些简单的字符串和int值,我正在使用XmlSerializer将其序列化为这样的文件。(这就是我正在使用的代码) 一切正常;我已验证序列化后,如果我在文件中输入了正确的数据,则正确的数据位于元素的文件中,并带有\r\n。问题出现在反序列化上(同样,字面上是我正在使用的代码,失败时的“测试”结果除外) 所以,;为什么我的Other属性在反序列化时会从其\r\n中丢失其\r?执行此操作的不是序列化程序,而是在Serialize方法内部为您创建的XmlWriter。如

可能重复:

我有一个类,上面有一些简单的字符串和int值,我正在使用XmlSerializer将其序列化为这样的文件。(这就是我正在使用的代码)

一切正常;我已验证序列化后,如果我在文件中输入了正确的数据,则正确的数据位于
元素的文件中,并带有
\r\n
。问题出现在反序列化上(同样,字面上是我正在使用的代码,失败时的“测试”结果除外)


所以,;为什么我的
Other
属性在反序列化时会从其
\r\n
中丢失其
\r

执行此操作的不是序列化程序,而是在Serialize方法内部为您创建的XmlWriter。如果您自己创建此编写器,并为其提供XmlWriterSettings对象,然后将此编写器传递给Serialize方法,而不是像现在这样传递给流,则可以更好地控制此编写器的设置。谷歌XmlWitterSettings.

这里有一个链接,您可以查看:

如果你在谷歌上搜索“XML回车”,你会找到许多其他的链接,指向有同样问题的人

看来这是故意的

这是因为兼容XML解析器在解析之前必须将CRLF和任何不后跟LF的CR转换为单个LF。这种行为在XML1.0规范的行尾处理部分中定义


为了保留换行符,您必须进行一些编码,或者在反序列化后将所有的
\n
更改回
\r

好吧,这肯定是错误的,序列化的文件中有CRLF,当未序列化时,它们只是LF。
XmlSerializer xmlser = new XmlSerializer(typeof(NPC));
using (Stream st = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) 
{
    xmlser.Serialize(st, npc);
}
XmlSerializer xmlser = new XmlSerializer(typeof(NPC));
NPC npc = null;
using (Stream st = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) 
{
    npc = (NPC)xmlser.Deserialize(st);
}
//Testing...
if(!npc.Other.Contains("\r\n")) 
{
    //this always occurs, even when the <Other></Other> item DOES have CR-LF
}
[Serializable]
public class NPC
{
    public int Field1{get; set;}
    public string Other {get; set;}
    public int Etc... {get; set;}
}