比較

2011-12-25 15 views
1

可能性の重複:
Fastest serializer and deserializer with lowest memory footprint in C#?比較

私は構造体またはクラスをシリアライズするBinaryFormatterクラスを使用しています。 (シリアライズ後、保存する前にシリアライズしたファイルを暗号化します(デシリアライズ前に復号化する))

しかし、私はいくつかの他のシリアライゼーションクラスが.Net Frameworkに存在すると聞いていました。 XmlSerializer、JavaScriptSerializer、DataContractSerializer、protobuf-netと同様です。

私が知りたいのは、どちらが私にとって最適ですか?

シリアル化/逆シリアル化に必要なRAM容量が私にとって最も重要なものです。スピードも重要です。

+0

http://stackoverflow.com/questions/626766/fastest-serializer-and-deserializer -with-lowest-memory-footprint-in-c – Matthias

+0

このような質問(意見を求める)は、StackExchange形式には適していません。 _specific_programming issuesについて質問してください(コードを投稿できない場合は、ここにはないはずです)。 – Oded

+0

@MarcGravellこれらの提案を回答として投稿してください。グループ化されたエンコードと暗号化されたストリームについて詳しく説明してください。どうもありがとう! –

答えて

4

メモリの要求を減らすことを目的としている場合は、で暗号化します。代わりに、Streamに直接シリアル化してください。 Stream APIは、過剰なバッファリングなしに複数の変換を実行するためにチェーン化された(デコレータパターン)ように設計されています。同様に、解読ストリームから逆直列化する。解読しないで逆シリアル化しないでください。このようにして、データは必要に応じてオンザフライで暗号化/復号化されます。メモリを減らすことに加えて、セキュリティにとっても優れています。これは、データ全体が単一のバッファとして解読された形で決して存在しないことを意味するためです。完全な例については、MSDNのCryptoStreamを参照してください。

追加の注意事項の場合はprotobuf-netを使用しますが、 "グループ化"エンコーディングを使用してメモリ内のバッファリングを減らす方法があります。サブメッセージ(リストを含む)のデフォルトは "長さ接頭辞"で、通常はこれを行う方法はデータをメモリにバッファリングして長さを計算することです。しかし、protobufは、長さを知る必要のない開始/終了マーカーを使用するフォーマットもサポートしているため、バッファリングは必要ありません。したがって、シーケンス全体を出力に直接渡すことができます(まあ、 IOを改善するために内部的には、最大再利用のためにここにバッファをプールします)。これは、サブオブジェクトのために、のように単純である:

[ProtoMember(11, DatFormat = DataFormat.Grouped)] 
public Customer Customer {get;set;} // a sub-object 

11には意味がない場合)