2009-07-12 4 views
8

私は[XmlText]とマークされたプロパティを持つクラスを持っています。これは複数行の入力を受け入れます。私のXMLファイルでは、テキストコンテンツ内の行末がinfactであることを確認しました"\r\n"、ファイルの残りの部分と同じです。 [XmlText]プロパティのセッターの内側に、valueはすでに終了ラインとして"\n"があり、XMLデシリアライゼーションは「標準化」の行末をどのように停止するのですか? (.NET)

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

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

しかし:

私はデシリアライズするために使用しているコードがあります。これが迷惑な主な理由は、"\n"行末が正しく表示されないからです。TextBox ...どの部分が問題を引き起こしているのか正確にはわかりませんが、ここの誰かが状況を明らかにすることができると思いました。

答えて

10

私はそれが簡単に素早くC#の開発環境にコードを入れて作るために、サンプルコードを変更しました。また、意図的にステートメントを使用していないので、サンプルコードのみです。

例えば、我々はシリアライズしたいフォロークラスがあります。私たちは、あなたが「同じ」がプリントアウトされます行が実行され得ることはありません記述する方法でこれをシリアライズし、デシリアライズしようとした場合

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

を(私はと交換し、コードが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クラスを割り当てることによって、固定することができます。正規化プロパティがfalseに設定されているシリアライザシリアライザで、デフォルトではdがtrueに設定されている):

​​

同じことが、今私は間違っていない限りは、必要な動作である、プリントアウトされるのですか?

+1

私はそれを好きだ;-p –

+2

しかし、レコードのために、サンプルコードでのステートメントの使用の欠如は、私の意見で読むことがより困難になります。 –

+0

@マシュー - 私はそれが主観的なものの一つだと思います。制御された実験を行うために本当に必要なものより優れていることを証明することです。私の答えでは、MemoryStreamは、シリアライゼーションとデシリアライゼーションの両方でスコープされる必要があるため、少し奇妙です。実世界では起こりません。あなたの質問が文を使用している場合は、(私の意見では)便利です。私がコードを書くとき、私は実際に使用している文を含めましたが、答えを投稿するときにそれらを切り出しました(私の脳はFXCopの不平を防ぐために配線されています)。 – RichardOD

4

をシリアライズした場合は、XmlWriterSettings.NewLineHandlingReplace)を試してみる価値はありますが、これは読書に役立ちません。汚れた、おそらくセッターで直接これを行うビット:

private string text; 
[XmlText] 
public string Text { 
    get { return text; } 
    set 
    { 
     Regex r = new Regex("(?<!\r)\n"); 
     text = r.Replace(value, "\r\n"); 
    } 
} 
+0

私は正規表現の置き換えが唯一の解決策かもしれないと思っていましたが、私はいくつかの "良い方法"があることを望んでいました[tm] –

+0

別の方法があります。まもなく答えます。 – RichardOD

+0

Regexは、\ r \ nの代わりに\ nのみが使用されているときを見つける良い例です。 – RichardOD

関連する問題