XmlSerializer将CR-LF反序列化为LF

时间:2012-12-14 03:40:31

标签: c# xmlserializer xml-deserialization

  

可能重复:
  XML Carriage return encoding

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

XmlSerializer xmlser = new XmlSerializer(typeof(NPC));
using (Stream st = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) 
{
    xmlser.Serialize(st, npc);
}

一切正常;我已经验证了在序列化时,正确的数据在<Other></Other>元素的文件中,如果我在文件中输入\r\n那么完整。问题出现在反序列化上(再次;字面上我正在使用的代码,除了失败后的'测试'结果)

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
}

反序列化后,string对象上具有\r\n值的属性会立即被\n替换。我在反序列化后验证了该文件在正确的元素中反映了\r\n,并且在测试npc被删除之前,我对\r对象没有做任何其他操作。

NPC是一个简单的类,定义如下:

[Serializable]
public class NPC
{
    public int Field1{get; set;}
    public string Other {get; set;}
    public int Etc... {get; set;}
}

因此;为什么我的Other属性在反序列化时会从\r失去\r\n

2 个答案:

答案 0 :(得分:2)

以下是您可以查看的链接:
XML Carriage return encoding

如果你谷歌“XML回车”,你会找到许多其他链接给同样问题的人。

这似乎是设计的。

  

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

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

答案 1 :(得分:0)

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