シリアライザ覚書(壱)


 むかーしむかしのWindowsアプリ開発で、外部ファイルにデータを保存する時に最もよく使ったのは、CSV形式だったと記憶している。カンマ区切りかタブ区切りかは、開発者の好みで別れるところだ。たまに固定長で、なんていうのも見かけた。CSVファイルはエクセルに取り込む事もできるので結構便利なんだ。CSVファイルに保存する実装は比較的簡単で、今のC#なら、
var csvText = "..."; //カンマ区切りが好み
System.IO.File.WriteAllText(@"c:\....\dataToSave.csv", csvText);
var dataLines = new List<string> {"..."};
System.IO.File.WriteAllText(@"c:\....\dataToSave.csv",
string.Join(",", dataLines));
になるだろうか。どちらかと言えば、どの項目をどの順番、どういう書式で出力しようかなんていう仕様を決めるのが大変だったと思う。
 他の会社のシステム(アプリケーション)からデータを貰う時もこれが多かった。ただし、そのシンプルさゆえに、ファイルからデータを取り込む時は大変だった。何番目にどんな項目があるかを取り決めた上でプログラムを組み、チェックを行い、エラーになる時はどうするかという仕様を決めていく。なんでこんな仕様?と思っても、ユーザが決めていたりすると、文句は言えても変えることはできない。実際、親方日の丸な組織から送られてくるデータを取り込みたいとき、その形式がまさにCSV形式で、それを取り込む実装をした事がある。その仕様がちゃんと公開されていたので、それほど苦労はしなかったけど。
 それじゃ駄目(このままじゃ駄目)だ!各項目に意味をもたせた方がもっとスムーズになるんだ!という事で生まれたのがXMLだったかな。初めて見た時は、「おー」と思ったものだけど、取り決めだの独自の仕様だの、変換だので、意外に実装は楽にならない。取り込む時だけでなく、出力するときにも気を使う必要があるので、結局大変だった。一体誰の為の仕様なのか、XMLの仕様を策定した人達に聞いてみたい。
 で、現在だと、クラスのシリアライズと逆シリアライズで済ませられる。データクラスのインスタンスをそのままファイルに保存し、必要があれば取り込んで、インスタンスを生成する。Webサービスに使われている技術だ。最近は好んでこれを使っている。だって楽だし。
 最近、作っている(更新し続けている)アプリが、どうも海外拠点でも使い始めたらしく、ユーザさんがパフォーマンスを気にしだした。その調査の一環として調べたのがシリアライザだった。覚書、或いはメモとして書いていく。

System.Xml.Serialization.XmlSerializer
 .NET1.1の頃にWebサービスの通信で使われているクラス。名前の通りファイル形式はXML。当時はこれしか選択肢がなかったような気がする。初期動作が重く、圧縮だの先にシリアライズ用クラスを作っておくだのと、仕掛けを行う必要がある。属性の宣言無しにシリアライズっちゃう「opt-out」。
 なお、.NET4の頃にWeb参照でWebサービス用Proxyクラスを作ると、すべてプロパティで作られ、余計な(非同期用)メソッドを作ったりで、合計で十万行を超えるコードを作りやがった。あと、クラスの名前空間が長いと、データ通信量も増えていく。

System.Runtime.Serialization.DataContractSerializer
 .NET3.5以降に出てきたWCFで使われるシリアライザ。WCFも基本はSOAPなので、ファイル形式はXML。XmlSerializerよりは性能が良いらしい。XmlSerializerとの違いは、明確な属性の宣言がないとシリアライズの対象としない「opt-in」であること。これが非常にめんどくさい。仕事ではT4ファイルで乗り切ったけど。Web参照で作るより、SvcUtil.exeでProxyクラスを作る方が融通が効いている感じ(Proxyクラスの共有とか)。これも名前空間が長くなるとそれだけ通信データ量も増えるのは同じ。

System.Runtime.Serialization.Json.DataContractJsonSerializer
 実は標準で用意されているJson形式用のシリアライズ/デシリアライズするクラス。DataContractSerializerと同じで「opt-in」。これに関しては前に書いた事がある。WCFでRESTサービスを実装しようと思うと、このクラスが活躍する事になる。

以上が標準装備なシリアライザ。以下は今回仕事がらみで調べた奴。

Protocol Buffers
 Googleが開発した知る人ぞ知るシリアライズフォーマット。XMLより軽量且つ高速が謳い文句。.NET向けに実装されたライブラリもちゃんと用意されている。Fullパッケージには、二種類のシリアライザが用意されている。
 ・ProtoBuf.Serializer
 ・ProtoBuf.ServiceModel.XmlProtoSerializer
 前者は純粋にバイナリ形式用のシリアライザで、後者はWCF通信用に用意されたシリアライザっぽい感じ。WCFにも適用させようと思えばできる。シンプルでさえあれば、かなり有用。

Json.NET
 3rdパーティ製のJSON形式のシリアライザ。性能はこっちが上という記事があった。やりたい事はDataContractJsonSerializerとかぶっている。WCFで、REST以外にJSON形式で通信できないかを調べた時に、単語としてひっかかった。
 WCF Serialization – A Case Study
 おお!とか思って同じように実装してみて、たしかに通信できたんだけど、TCP-MONで見た限りでは、JSONではなくXMLだったので、がっくり来てしまった。

その弐に続く。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m