restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【C#】C#プログラミングのイディオム(12章)シリアル化、逆シリアル化(おまけ)

仕事で使いそうになったので、自身含めて、利用したことのないメンバーの為に整理する。

シリアル化、逆シリアル化の何を取るにしても、以下のSTEPで定義をすれば良さそう。

  1. シリアライズ、逆シリアライズの為の入出力ファイルの指定(外部ファイル)
  2. シリアライズ、逆シリアライズのデータ定義の指定(オブジェクト)
  3. 処理の実行

と思われる。

例えば、オブジェクトをシリアライズする場合

using(var writer = XMLWriter.Create("hoge.xml")){   // 1.シリアライズした出力先の設定
     var serializer = new XMLSerializer(hoge.GetType());   //  2.シリアライズする元データの設定(ここではhogeクラスに定義したデータ)
     serializer.Serialize(writer, hoge);                            //  3.シリアライズの実行
}

JSONデータを逆シリアライズし、オブジェクトに設定する場合

using(var stream = new FileStream("hoge.json", FileMode.Open, FileAccess.Read)){    // 1.逆シリアライズする元データの設定
      var serializer = new DataContractJsonSerializer(typeof(hoge[]));                //  2.逆シリアライズするオブジェクトの指定
      var hoge = serializer.ReadObject(stream) as hoge;                            // 3.逆シリアライズの実行
}

で行けそうかなと。

また、テキストでは、練習問題以外、JSONデータの並びと、 オブジェクトのプロパティ設定の定義順が同じだったので、XMLと同じように 型定義の順番が左右するかと思っていた。

しかし、練習問題を実施すると、そうではなさそう。ということで、ググってみると

stackoverrun.com

JSONには並び順の保証は内容で。 文字ならば、辞書のように、a,b,c・・・で昇順になっていそうです。 並び順を固定するには、連想配列などにして、実施するのがよさげかな?