BinaryFormatter のドロップイン置換はありませんが、.NET 型のシリアル化に推奨されるシリアライザーがいくつかあります。 選択したシリアライザーに関係なく、新しいシリアライザーとの統合には変更が必要になります。 これらの移行中に、新しいシリアライザーを強制して既存の型を可能な限り少ない変更で処理することと、選択したシリアライザーを使用して慣用的なシリアル化を有効にするリファクタリング型との間のトレードオフを考慮することが重要です。 シリアライザーを選択したら、そのドキュメントを調べてベスト プラクティスを確認する必要があります。
バイナリシリアル化形式が要件でない場合は、JSON または XML シリアル化形式の使用を検討できます。 これらのシリアライザーは .NET に含まれており、正式にサポートされています。
- System.Text.Json を使用する JSON
-
System.Runtime.Serialization.DataContractSerializer
を使用する XML
シナリオでコンパクトなバイナリ表現が重要な場合は、次のシリアル化形式とオープン ソース シリアライザーをお勧めします。
- MessagePack for C# を使用する MessagePack
- protobuf-net を使用するプロトコル バッファー
シリアル化された型の API の形状を変更する制御があるかどうかは、シリアル化の方向とアプローチに影響します。 これらのシリアライザーへの移行は、新しい属性を使用して型に注釈を付けたり、新しいコンストラクターを追加したり、型/メンバーをパブリックにしたり、フィールドをプロパティに変更したりする機能があれば、より簡単な場合があります。 この機能がない場合、最新のシリアライザーを使用するのに、カスタムのコンバーターまたはリゾルバーの実装が必要になる可能性があります。
機能 | BinaryFormatter | System.Text.Json | DataContractSerializer | C 用 MessagePack# | protobuf-net |
---|---|---|---|---|---|
Serialization形式 | バイナリ (NRBF) | JSON(ジェイソン) | XML | バイナリ (MessagePack) | バイナリ (プロトコル バッファー) |
コンパクトな表記 | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
人間が判読できる | ❌️ | ✔️ | ✔️ | ❌️ | ❌️ |
パフォーマンス | ❌️ | ✔️ | ❌ | ✔️ | ✔️ |
[Serializable] 属性のサポート |
✔️ | ❌ | ✔️ | ❌ | ❌ |
パブリック型のシリアル化 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
非パブリック型のシリアル化 | ✔️ | ✔️ | ✔️ | ✔️ (リゾルバーが必要) | ✔️ |
フィールドのシリアル化 | ✔️ | ✔️ (オプトイン) | ✔️ | ✔️ (属性が必要) | ✔️ (属性が必要) |
非パブリック フィールドのシリアル化 | ✔️ | ✔️ (リゾルバーが必要) | ✔️ | ✔️ (リゾルバーが必要) | ✔️ (属性が必要) |
プロパティのシリアル化 | ✔️* | ✔️ | ✔️ | ✔️ (属性が必要) | ✔️ (属性が必要) |
読み取り専用メンバーの逆シリアル化 | ✔️ | ✔️ (属性が必要) | ✔️ | ✔️ | ✔️ (パラメーターなしの ctor が必要) |
ポリモーフィック型階層 | ✔️ | ✔️ (属性が必要) | ✔️ | ✔️ (属性が必要) | ✔️ (属性が必要) |
AOT サポート | ❌️ | ✔️ | ❌ | ✔️ | ❌ (計画済み) |
System.Text.Json を使用する JSON
System.Text.Json
ライブラリは、JavaScript Object Notation (JSON) 形式のセキュリティ、ハイ パフォーマンス、少ないメモリ割り当てを重視する最新のシリアライザーです。 JSON は人間が判読できるもので、広範なクロスプラットフォーム サポートを備えています。 テキストベース形式はバイナリ形式ほどコンパクトではありませんが、圧縮によってサイズを大幅に削減できます。
Serialization では、属性とコンストラクターを通じて特別に処理されない限り、非パブリック メンバーと読み取り専用メンバーは除外されます。 System.Text.Json では、 カスタムのシリアル化と逆シリアル化 もサポートされており、型を JSON に変換する方法やその逆の方法をより詳細に制御できます。 System.Text.Json では、[Serializable]
属性はサポートされません。
System.Text.Json (JSON) に移行します。
DataContractSerializer を使用する XML
DataContractSerializer は .NET Framework 3.0 で導入されたもので、Windows Communication Foundation (WCF) メッセージで送信されたデータをシリアル化および逆シリアル化するために使用されます。
DataContractSerializerは、BinaryFormatter
で使用されたシリアル化プログラミング モデルを完全にサポートする XML シリアライザーです。つまり、[Serializable]
属性とISerializableの実装が優先されます。 そのため、移行に必要な労力が最も少ないシリアライザーです。 ただし、既知の型を前もって指定する必要があります (ただし、ほとんどの .NET コレクションとプリミティブ型は既定の許可リストに含まれているため、指定する必要はありません)。
DataContractSerializer
は BinaryFormatter から移行する際に機能上の利点を維持しますが、他の選択肢ほど最新でもなく、パフォーマンスも優れていません。
DataContractSerializer (XML)に移行します。
警告
DataContractSerializer と NetDataContractSerializer を混同しないようにしてください。 NetDataContractSerializer は、 の逆シリアル化として識別されます。
MessagePack を使用するバイナリ
MessagePack はコンパクトなバイナリ シリアル化形式であるため、JSON や XML と比較してメッセージ サイズが小さくなります。 オープンソースの MessagePack for C# ライブラリはパフォーマンスが高く、さらに小さいデータ サイズに対して組み込みの超高速 LZ4 圧縮を提供します。 データ型に DataContractSerializer
またはライブラリ独自の属性のいずれかで注釈が付けられている場合に最適に機能します。 AOT 環境、非パブリックの型とメンバー、読み取り専用の型とメンバーをサポートするように構成できます。
protobuf-net を使用するバイナリ
protobuf-net ライブラリは、バイナリ プロトコル バッファー シリアル化形式を使用する .NET 用のコントラクト ベースのシリアライザーです。 この API は一般的な .NET パターンに従っていて、XmlSerializer
や DataContractSerializer
にほぼ相当します。 この一般的なライブラリは機能も豊富で、非パブリックの型やフィールドを処理できますが、多くのシナリオではメンバーに属性を適用する必要があります。
.NET