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