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

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

サンプルの詳細

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

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

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

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);
        if (type == 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 2010 を使用して、DCRSample.sln ソリューション ファイルを開きます。

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

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

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

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

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

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

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

Ee621289.Important(ja-jp,VS.100).gif 注 :
サンプルは、既にコンピューターにインストールされている場合があります。続行する前に、次の (既定の) ディレクトリを確認してください。

<InstallDrive>:\WF_WCF_Samples

このディレクトリが存在しない場合は、「.NET Framework 4 向けの Windows Communication Foundation (WCF) および Windows Workflow Foundation (WF) のサンプル」にアクセスして、Windows Communication Foundation (WCF) および WF のサンプルをすべてダウンロードしてください。このサンプルは、次のディレクトリに格納されます。

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Contract\Data\NetDcSasDcSwithDCR