次の方法で共有


シリアル化

このコンテンツは、 フレームワーク設計ガイドライン (再利用可能な .NET ライブラリの規則、イディオム、パターン、第 2 版) から、Pearson Education, Inc. のアクセス許可によって再印刷されます。 そのエディションは2008年に出版され、その後 、本は第3版で完全に改訂されています。 このページの情報の一部が古くなっている可能性があります。

シリアル化は、オブジェクトを簡単に永続化または転送できる形式に変換するプロセスです。 たとえば、オブジェクトをシリアル化し、HTTP を使用してインターネット経由で転送し、宛先マシンで逆シリアル化することができます。

.NET Framework には、さまざまなシリアル化シナリオ用に最適化された 3 つの主要なシリアル化テクノロジが用意されています。 次の表に、これらのテクノロジと、これらのテクノロジに関連する主要なフレームワークの種類を示します。

テクノロジ名 主な型 シナリオ
データ コントラクトのシリアル化 DataContractAttribute
DataMemberAttribute
DataContractSerializer
NetDataContractSerializer
DataContractJsonSerializer
ISerializable
一般的な永続化
Web サービス
JSON(ジェイソン)
XML シリアル化 XmlSerializer XML の形状を完全に制御する XML 形式
ランタイムシリアル化 (バイナリと SOAP) SerializableAttribute
ISerializable
BinaryFormatter
SoapFormatter
.NET リモート処理

✔️ 新しい型を設計するときは、シリアル化について考慮してください。

サポートする適切なシリアル化テクノロジの選択

✔️ Web サービスで型のインスタンスを永続化または使用する必要がある場合は、データ コントラクトのシリアル化をサポートすることを検討してください。

✔️ 型のシリアル化時に生成される XML 形式をより詳細に制御する必要がある場合は、データ コントラクトシリアル化の代わりに、またはデータ コントラクトのシリアル化に加えて XML シリアル化をサポートすることを検討してください。

これは、データ コントラクトのシリアル化でサポートされていない XML コンストラクトを使用して XML 属性を生成する必要がある一部の相互運用性シナリオで必要になる場合があります。

✔️ 型のインスタンスが .NET リモート処理の境界を越えて移動する必要がある場合は、ランタイム シリアル化のサポートを検討してください。

❌ 一般的な永続化の理由から、ランタイムシリアル化または XML シリアル化のサポートは避けてください。 代わりに、データ コントラクトのシリアル化を優先します。

データ コントラクトのシリアル化のサポート

型は、型に DataContractAttribute を適用し、 DataMemberAttribute を型のメンバー (フィールドとプロパティ) に適用することで、データ コントラクトのシリアル化をサポートできます。

✔️ 型を部分信頼で使用できる場合は、型のデータ メンバーをパブリックにマークすることを検討してください。

完全信頼では、データ コントラクト シリアライザーは非パブリック型とメンバーをシリアル化および逆シリアル化できますが、部分信頼でシリアル化および逆シリアル化できるのはパブリック メンバーのみです。

✔️ DataMemberAttributeを持つすべてのプロパティにゲッターとセッターを実装します。 データ コントラクト シリアライザーでは、型のゲッターとセッターの両方をシリアル化可能と見なす必要があります。 (.NET Framework 3.5 SP1 では、一部のコレクション プロパティは取得のみ可能です)。型が部分信頼で使用されない場合、プロパティ アクセサーの一方または両方を非パブリックにすることができます。

✔️ 逆シリアル化されたインスタンスの初期化にシリアル化コールバックを使用することを検討してください。

オブジェクトが逆シリアル化されるときにコンストラクターは呼び出されません。 (ルールには例外があります。 CollectionDataContractAttribute でマークされたコレクションのコンストラクターは、逆シリアル化中に呼び出されます)。そのため、通常の構築中に実行されるロジックは、シリアル化コールバックの 1 つとして実装する必要があります。

OnDeserializedAttribute は、最も一般的に使用されるコールバック属性です。 ファミリ内の他の属性は、 OnDeserializingAttributeOnSerializingAttribute、および OnSerializedAttributeです。 これらは、逆シリアル化前、シリアル化前、最後にシリアル化後にそれぞれ実行されるコールバックをマークするために使用できます。

✔️ 複雑なオブジェクト グラフを逆シリアル化するときに使用する必要がある具象型を示すには、 KnownTypeAttribute を使用することを検討してください。

✔️ シリアル化可能な型を作成または変更する場合は、下位互換性と前方互換性を考慮してください。

型の将来のバージョンのシリアル化されたストリームは、現在のバージョンの型に逆シリアル化でき、その逆も可能であることに注意してください。

データ コントラクト属性に対して明示的なパラメーターを使用してコントラクトを保持するように特別な注意を払わない限り、データ メンバーは、プライベートおよび内部であっても、名前、型、または将来のバージョンの型の順序を変更できないことを理解しておいてください。

シリアル化可能な型に変更を加えるときに、シリアル化の互換性をテストします。 新しいバージョンを古いバージョンに逆シリアル化してみてください。その逆も同様です。

✔️ 型の異なるバージョン間のラウンドトリップを許可する IExtensibleDataObject の実装を検討してください。

このインターフェイスを使用すると、シリアライザーはラウンドトリップ中にデータが失われないようにすることができます。 IExtensibleDataObject.ExtensionData プロパティは、現在のバージョンに不明な型の将来のバージョンのデータを格納するために使用されるため、データ メンバーに格納できません。 現在のバージョンが後でシリアル化され、将来のバージョンに逆シリアル化されると、シリアル化されたストリームで追加のデータが使用できるようになります。

XML シリアル化のサポート

データ コントラクトのシリアル化は、.NET Framework の主要な (既定の) シリアル化テクノロジですが、データ コントラクトのシリアル化でサポートされないシリアル化シナリオがあります。 たとえば、シリアライザーによって生成または使用される XML の形状を完全に制御することはできません。 このような細かい制御が必要な場合は、XML シリアル化を使用する必要があり、このシリアル化テクノロジをサポートするように型を設計する必要があります。

❌ 生成される XML の形状を制御する非常に強力な理由がない限り、XML シリアル化専用の型の設計は避けてください。 このシリアル化テクノロジは、前のセクションで説明したデータ コントラクトのシリアル化に置き換わりました。

✔️ XML シリアル化属性を適用して提供される XML よりもシリアル化された XML の形状をさらに制御する場合は、 IXmlSerializable インターフェイスの実装を検討してください。 インターフェイスの 2 つのメソッド ( ReadXmlWriteXml) を使用すると、シリアル化された XML ストリームを完全に制御できます。 XmlSchemaProviderAttributeを適用して、型に対して生成される XML スキーマを制御することもできます。

ランタイムシリアル化のサポート

ランタイム シリアル化は、.NET リモート処理で使用されるテクノロジです。 型が .NET リモート処理を使用して転送されると思われる場合は、ランタイム シリアル化がサポートされていることを確認する必要があります。

ランタイム シリアル化の基本的なサポートは、 SerializableAttributeを適用することによって提供できます。より高度なシナリオでは、単純なランタイム シリアル化可能パターンの実装 ( ISerializable の実装とシリアル化コンストラクターの提供) が含まれます。

✔️ 型が .NET リモート処理で使用される場合は、ランタイム シリアル化のサポートを検討してください。 たとえば、 System.AddIn 名前空間では .NET リモート処理が使用されるため、 System.AddIn アドイン間で交換されるすべての型はランタイム シリアル化をサポートする必要があります。

✔️ シリアル化プロセスを完全に制御する場合は、ランタイム シリアル化可能パターンの実装を検討してください。 たとえば、シリアル化または逆シリアル化されたデータを変換する場合などです。

パターンは非常に単純です。 必要なのは、 ISerializable インターフェイスを実装し、オブジェクトが逆シリアル化されるときに使用される特別なコンストラクターを提供することです。

✔️ シリアル化コンストラクターを保護し、次のサンプルに示すように、型指定され、名前が正確に指定された 2 つのパラメーターを指定します。

[Serializable]
public class Person : ISerializable
{
    protected Person(SerializationInfo info, StreamingContext context)
    {
        // ...
    }
}

✔️ ISerializable メンバーを明示的に実装します。

✔️ リンク要求を ISerializable.GetObjectData 実装に適用します。 これにより、完全に信頼されたコアとランタイム シリアライザーのみがメンバーにアクセスできるようになります。

Portions © 2005, 2009 Microsoft Corporation. 無断転載を禁じます。

フレームワーク設計ガイドライン:再利用可能な .NET ライブラリの規則、イディオム、パターン、Krzysztof Cwalina および Brad Abrams による第 2 版は、2008 年 10 月 22 日に Microsoft Windows 開発シリーズの一部として Addison-Wesley Professional によって公開されました。

こちらも参照ください