-1

重複の可能性:
XMLキャリッジリターンエンコーディング

XmlSerializerを使用してそのようなファイルにシリアル化するいくつかの単純な文字列とint値を持つクラスがあります。(これは文字通り私が使用しているコードです)

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キャリッジリターンエンコーディング

「XMLCarriageReturn」をグーグルで検索すると、同じ問題を抱えている人々へのリンクが他にもたくさんあります。

これは仕様によるもののようです。

これは、準拠するXMLパーサーは、解析する前に、CRLFおよびLFが後に続かないCRを単一のLFに変換する必要があるためです。この動作は、XML1.0仕様のEnd-of-Line処理セクションで定義されています。

改行を保持するには、エンコードを行うか、逆シリアル化後にすべてを元に\n戻す必要があります\r

于 2012-12-14T03:54:55.193 に答える
-1

これを行うのはシリアライザーではなく、Serializeメソッド内で作成されるXmlWriterです。XmlWritterSettingsオブジェクトを指定して自分で作成し、このライターを現在のようにストリームではなくSerializeメソッドに渡すと、このライターの設定をより細かく制御できます。GoogleXmlWitterSettings。

于 2012-12-14T03:47:49.473 に答える