10

我有一个带有标记为属性的类[XmlText],它接受多行输入。在我的 XML 文件中,我已验证文本内容中的行结尾是 infact "\r\n",与文件的其余部分相同。

我用来反序列化的代码是:

XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList));
string file = "test.xml";

if (File.Exists(file))
{
    using (TextReader r = new StreamReader(file))
    {
        foo = configSerializer.Deserialize(r);
    }
}

[XmlText]但是,在属性的设置器内部,value已经有"\n"一个行结尾。这很烦人的主要原因是因为"\n"行结尾没有正确显示TextBox...我不确定是哪个部分导致了问题,但我认为这里的某个人可能能够对这种情况有所了解。

4

2 回答 2

12

我更改了示例代码,以便更轻松地将代码快速放入 C# 开发环境。我也故意不包括 using 语句 - 它只是示例代码。

对于示例,我们希望序列化以下类:

   public class DataToSerialize
   {
       public string Name { get; set; }
   }

如果我们尝试以您描述打印出“Same”的行的方式对其进行序列化和反序列化,则不会执行(我假设代码将使用 Environment.NewLine 在 Windows 上运行,替换为“\r\n”如果你不是):

    DataToSerialize test = new DataToSerialize();
    test.Name = "TestData" + Environment.NewLine;
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize));
    MemoryStream ms = new MemoryStream();
    StreamWriter sw = new StreamWriter(ms);
    configSerializer.Serialize(sw, test);
    ms.Position = 0;
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(ms);
    if (deserialized.Name.Equals("TestData" + Environment.NewLine))
    {
        Console.WriteLine("Same");
    }

然而,这可以通过手动将 XmlTextReader 分配给序列化程序来修复,并将其 Normalization 属性设置为 false(默认情况下在序列化程序中使用的属性设置为 true):

    DataToSerialize test = new DataToSerialize();
    test.Name = "TestData" + Environment.NewLine;
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize));
    MemoryStream ms = new MemoryStream();
    StreamWriter sw = new StreamWriter(ms);

    configSerializer.Serialize(sw, test);
    ms.Position = 0;
    XmlTextReader reader = new XmlTextReader(ms);
    reader.Normalization = false;
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(reader);
    if (deserialized.Name.Equals("TestData" + Environment.NewLine))
    {
        Console.WriteLine("Same");
    }

现在将打印出相同的内容,除非我错了,否则您需要的行为是什么?

于 2009-07-12T09:36:55.977 回答
5

如果您正在序列化,那么XmlWriterSettings.NewLineHandling( Replace) 值得尝试 - 但这无助于阅读。有点蹩脚,但也许直接在 setter 中执行此操作:

private string text;
[XmlText]
public string Text {
    get { return text; }
    set 
    {
        Regex r = new Regex("(?<!\r)\n");
        text = r.Replace(value, "\r\n"); 
    }
}
于 2009-07-12T07:14:48.153 回答