MessagePack (バイナリ) への移行
MessagePack はコンパクトなバイナリ シリアル化形式であるため、JSON や XML と比較してメッセージ サイズが小さくなります。 オープンソースの MessagePack for C# ライブラリはパフォーマンスが高く、さらに小さいデータ サイズに対して組み込みの超高速 LZ4 圧縮を提供します。 データ型に DataContractSerializer
またはライブラリ独自の属性のいずれかで注釈が付けられている場合に最適に機能します。 AOT 環境、非パブリック型とメンバー、読み取り専用の型とメンバーをサポートするように構成できます。
MessagePack for C# の一部の動作と機能は、特にシリアル化された型の API に対する変更を行うことができないか、最小限に抑える必要がある場合に、BinaryFormatter からの移行で優れています。
既定では、シリアル化できるのはパブリック型だけです。 プライベートおよび内部の構造体とクラスは、
StandardResolverAllowPrivate.Options
がMessagePackSerializer.Serialize
およびMessagePackSerializer.Deserialize
メソッドの引数として提供されている場合にのみシリアル化できます。MessagePack では、シリアル化可能なそれぞれの型に
[MessagePackObject]
属性で注釈を付ける必要があります。 これは、ContractlessStandardResolver を使用して回避することが可能ですが、将来的にバージョン管理で問題が発生する可能性があります。シリアル化可能なすべての非静的フィールドとプロパティには、
[Key]
属性を使用して注釈を付ける必要があります。[MessagePackObject(keyAsPropertyName: true)]
属性を使用して型に注釈を付けた場合、メンバーに明示的な注釈は必要ありません。 このような場合、特定のパブリック メンバーを無視するには、[IgnoreMember]
属性を使用します。プライベート メンバーをシリアル化するには、StandardResolverAllowPrivate を使用します。
System.Runtime.Serialization
注釈を MessagePack 注釈の代わりに使用できます ([DataContract]
ではなく[MessagePackObject]
、[DataMember]
ではなく[Key]
、[IgnoreDataMember]
ではなく[IgnoreMember]
)。 これらの注釈は、ライブラリ内のシリアル化可能な型を定義する MessagePack への依存関係を回避する場合に便利です。読み取り専用または変更不可の型とメンバーがサポートされています。 シリアライザーは、最も一致した引数リストを持つパブリック コンストラクターの使用を試みます。 コンストラクターは、
[SerializationConstructor]
属性を使用して明示的な方法で指定できます。任意の型の Serialization が、作成の簡単なカスタム フォーマッタを使用してサポートされます。 これにより、属性と特定のコンストラクターまたはメンバー パターンのすべての要件が取り除かれます。
シリアライザーは、.NET 基本クラス ライブラリによって提供される、最も頻繁に使用される組み込み型とコレクションをサポートします。 完全な一覧については、公式ドキュメントを参照してください。これにはカスタマイズ可能な拡張ポイントがあります。
警告
MessagePack には、型の制限なくデータを逆シリアル化できる API があります。 MessagePack セキュリティ ノートに従って、これらの API を回避する必要があります。
警告
一部の MessagePack API には、"変更可能なスタティック" を使用してカスタマイズできる動作があります。つまり、同じプロセス内の他のコード (AssemblyLoadContext または AppDomain) が何を行うかに基づいて、コードが成功または失敗する可能性があります。 コードの回復性を維持するには、MessagePackAnalyzer パッケージも参照し、動作が変更可能な API の使用を呼び出す MsgPack001 および MsgPack002 アナライザーを有効にします。
.NET