読者です 読者をやめる 読者になる 読者になる

checkpoint

自分用のIT技術系ノートです。古い情報や間違っている情報もあるので注意。

XmlSerializerで作成したXMLを加工してからファイルに書きこみたい

と、思ったので、XmlSerializer.Serializeメソッドの引数にMemoryStreamを放り込んでStreamReaderで読めばOKじゃよね!
とか言いつつサンプルコードを書いてみたのですが、最終的にできあがったファイルに元オブジェクトの情報が全然書き込まれてませんでした。


シリアル化はちゃんとできているのに、ストリームの内容を読み込んだら空文字。なにこの怪奇現象…夏はもう終わりじゃよ?


まあ、結論から言うとMemoryStreamのPositionがラストになってただけなんですけどね。落ち着いて考えたら当たり前ですね。もうね、苦笑いですよ。
Positionを0に戻せば一件落着。サンプルコードはこんな感じ。

   public class Hoge
    {
        public Hoge(int id, string name)
        {
            this.ID = id;
            this.Name = name;
        }

        public int ID;
        public string Name;

        // HogeクラスをXMLファイルに書き出す
        public static void SerializeHoge()
        {
            Hoge objHoge = new Hoge(1, "HogeName");

            XmlSerializer xs = new XmlSerializer(typeof(Hoge));
            string hogeXml;

            // MemoryStreamに書き込んで、StreamReaderで読む
            using (MemoryStream ms = new MemoryStream())
            {
                xs.Serialize(ms, objHoge);
                ms.Position = 0; // ←これが無いとワシみたいなことになる。
                StreamReader sr = new StreamReader(ms, Encoding.UTF8);
                hogeXml = sr.ReadToEnd();
            }
            // 取得したhogeXmlを加工(省略)
            
            // 加工後の内容をファイルに書き出す
            using (StreamWriter sw = new StreamWriter(@"C:\Temp\hoge.xml", false, Encoding.UTF8))
            {
                sw.Write(hogeXml);
            }
        }
    }