私は DataContractSerializer の使用の一部をプロトコル バッファのシリアル化 (具体的には protobuf-net を使用) に切り替えて、シリアル化を高速化し、データベース BLOB に格納するためのシリアル化されたデータ サイズを小さくしています。
オブジェクト モデルを変更すると、メッセージ サイズに大きな影響があることがわかりました。これは、選択したオブジェクト モデルが原因でシリアル化されたデータが人為的に膨らんでいることを意味すると考えており、それを修正したいと考えています。
特に私の質問は、protobuf-net の使用法、またはシリアライゼーション ライブラリを変更して、メッセージ サイズを小さくすることはできますか? オブジェクト モデルと、これまでに把握できたことを以下に示します。
私の場合、OCRデータをシリアル化しています...これは単純化されたオブジェクトモデルです:
[ProtoContract(SkipConstructor = true, UseProtoMembersOnly = true)]
public class OcrTable
{
[ProtoMember(1)]
public List<OcrTableCell> Cells;
}
[ProtoContract(SkipConstructor = true, UseProtoMembersOnly = true)]
public class OcrTableCell
{
[ProtoMember(1)]
public int Row;
[ProtoMember(2)]
public int Column;
[ProtoMember(3)]
public int RowSpan;
//...
[ProtoMember(10)]
public int Height;
[ProtoMember(11)]
public List<OcrCharacter> Characters;
}
[ProtoContract(SkipConstructor = true, UseProtoMembersOnly = true)]
public class OcrCharacter
{
[ProtoMember(1)]
public int Code;
[ProtoMember(2)]
public int Data;
[ProtoMember(3)]
public int Confidence;
//...
[ProtoMember(11)]
public int Width;
}
データは最終的に関連付けられたプリミティブ (ほとんどがint
) の集まりにすぎないため、パック ビット シリアライゼーションの利点が役立つと思いますが、現在のクラス構造では、実際のリストはすべてカスタム型です。
パックされたビットのシリアライゼーションを可能にするために、カスタム型を完全に削除し、プリミティブの複数のリストをそれらのシーケンスによって関連付けることをいじくり回しました。例えば:
[ProtoContract(SkipConstructor = true, UseProtoMembersOnly = true)]
public class OcrTableCell
{
[ProtoMember(1)]
public int Row;
//...
[ProtoMember(10)]
public int Height;
[ProtoMember(11, IsPacked=true)]
public List<int> CharacterCode;
[ProtoMember(12, IsPacked=true)]
public List<int> CharacterData;
//...
[ProtoMember(21, IsPacked=true)]
public List<int> CharacterWidth;
}
List<OcrCharacter>
の各フィールドに 1 つずつ、複数のリストに置き換えたことがわかりますOcrCharacter
。これはシリアル化されたデータ サイズにかなり大きな影響を与え、場合によっては (gzip 後でも) 3 分の 2 減少します。
シリアライゼーションをサポートするためだけにオブジェクト モデルにこのような変更を加えるのは現実的ではないと思います...そして、シリアライゼーションの準備のために 2 番目の「ヘルパー」モデルを保持することは望ましくないようです。
それでも、データのオブジェクト モデルが原因で、シリアル化されたデータ サイズが人為的に膨らんでいることに悩まされています。
このタイプのオブジェクトグラフをシリアル化するためのシリアル化パラメータまたはライブラリのより良い選択はありますか? DataFormat=DataFormat.Group
リストに適用される属性を設定しようとしProtoMember
ましたが、メッセージ サイズがまったく変化せず、混乱しました。