-1

可能重复:
XML 回车编码

我有一个类,上面有一些简单的字符串和 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

4

2 回答 2

3

这是您可以查看的链接:
XML 回车编码

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

这似乎是设计使然。

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

为了保留你的换行符,你必须做一些编码,或者在反序列化之后简单地改变你的\n所有\r内容

于 2012-12-14T03:54:55.193 回答
-1

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

于 2012-12-14T03:47:49.473 回答