DataContractSerializer と DataContractResolver を使用した NetDataContractSerializer 機能の提供

NetDcSasDcSwithDCR サンプルでは、DataContractSerializer を適切な DataContractResolver と共に使用して、NetDataContractSerializer と同じ機能を提供する方法を示します。 このサンプルで示すのは、DataContractResolver を作成して DataContractSerializer に追加する方法です。

サンプルの詳細

NetDataContractSerializer は、1 つの重要な点で DataContractSerializer とは異なります。NetDataContractSerializer はシリアル化された XML の中に CLR 型情報を含みますが、DataContractSerializer にはこの情報は含まれません。 したがって、NetDataContractSerializer は、シリアル化と逆シリアル化の両方で、同一の CLR 型を共有する結果になる場合のみ使用できます。 ただし、DataContractSerializer よりも優れたパフォーマンスが得られるため、NetDataContractSerializer を使用することをお勧めします。 DataContractSerializer を追加することによって、DataContractResolver でシリアル化される情報を変更することができます。

このサンプルは、2 つのプロジェクトで構成されます。 最初のプロジェクトでは、NetDataContractSerializer を使用してオブジェクトをシリアル化します。 2 番目のプロジェクトでは、DataContractSerializerDataContractResolver と共に使用して、最初のプロジェクトと同じ機能を提供します。

次のコード例では、DCSwithDCR プロジェクトの DataContractResolver に追加される MyDataContractResolver という名前のカスタム DataContractSerializer の実装を示します。

class MyDataContractResolver : DataContractResolver
{
    private XmlDictionary dictionary = new XmlDictionary();

    public MyDataContractResolver()
    {
    }

    // Used at deserialization
    // Allows users to map xsi:type name to any Type
    public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
    {
        Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, null);
        type ??= Type.GetType(typeName + ", " + typeNamespace);
        return type;
    }

    // Used at serialization
    // Maps any Type to a new xsi:type representation
    public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
    {
        knownTypeResolver.ResolveType(dataContractType, null, out typeName, out typeNamespace);
        if (typeName == null || typeNamespace == null)
        {
            XmlDictionary dictionary = new XmlDictionary();
            typeName = dictionary.Add(dataContractType.FullName);
            typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
        }
    }
}

このサンプルを使用するには

  1. Visual Studio を使用して、DCRSample.sln ソリューション ファイルを開きます。

  2. ソリューション ファイルを右クリックし、 [プロパティ] を選択します。

  3. [ソリューション プロパティ ページ] ダイアログの [共通プロパティ][スタートアップ プロジェクト] で、 [マルチ スタートアップ プロジェクト] を選択します。

  4. DCSwithDCR プロジェクトの横にある [アクション] ボックスの一覧から [開始] を選択します。

  5. NetDCS プロジェクトの横にある [アクション] ボックスの一覧から [開始] を選択します。

  6. [OK] をクリックしてダイアログ ボックスを閉じます。

  7. ソリューションをビルドするには、Ctrl+Shift+B キーを押します。

  8. ソリューションを実行するには、Ctrl キーを押しながら F5 キーを押します。