次の方法で共有


DataContractSerializer と DataContractResolver を使用して NetDataContractSerializer の機能を提供する

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

サンプルの詳細

NetDataContractSerializer DataContractSerializerとは 1 つの重要な点で異なります。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++キーを押します。

  8. ソリューションを実行するには、+ キーを押します。