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) は試してみる価値がありますが、これは読むのに役立ちません。少し汚れていますが、セッターで直接これを行うこともできます:

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 に答える