我有一个类,其中包含一些简单的字符串和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
?
答案 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。