DataContractSerializer と DataContractResolver を使用した NetDataContractSerializer 機能の提供
このサンプルでは、DataContractSerializer を適切な DataContractResolver と共に使用して、NetDataContractSerializer と同じ機能を提供する方法を示します。このサンプルで示すのは、DataContractResolver を作成して DataContractSerializer に追加する方法です。
サンプルの詳細
NetDataContractSerializer は、1 つの重要な点で DataContractSerializer とは異なります。NetDataContractSerializer はシリアル化された XML の中に CLR 型情報を含みますが、DataContractSerializer にはこの情報は含まれません。したがって、NetDataContractSerializer は、シリアル化と逆シリアル化の両方で、同一の CLR 型を共有する結果になる場合のみ使用できます。ただし、NetDataContractSerializer よりも優れたパフォーマンスが得られるため、DataContractSerializer を使用することをお勧めします。DataContractResolver を追加することによって、DataContractSerializer でシリアル化される情報を変更することができます。
このサンプルは、2 つのプロジェクトで構成されます。最初のプロジェクトでは、NetDataContractSerializer を使用してオブジェクトをシリアル化します。2 番目のプロジェクトでは、DataContractSerializer を DataContractResolver と共に使用して、最初のプロジェクトと同じ機能を提供します。
次のコード例では、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);
}
}
}
このサンプルを使用するには
Visual Studio 2010 を使用して、DCRSample.sln ソリューション ファイルを開きます。
ソリューション ファイルを右クリックし、[プロパティ] をクリックします。
[ソリューション プロパティ ページ] ダイアログ ボックスの [共通プロパティ] の [スタートアップ プロジェクト] で、[マルチ スタートアップ プロジェクト] を選択します。
DCSwithDCR プロジェクトの横にある [アクション] ボックスの一覧から [開始] を選択します。
NetDCS プロジェクトの横にある [アクション] ボックスの一覧から [開始] を選択します。
[OK] をクリックしてダイアログ ボックスを閉じます。
ソリューションをビルドするには、F6 キーを押します。
ソリューションを実行するには、Ctrl キーを押しながら F5 キーを押します。
注 : |
---|
サンプルは、既にコンピューターにインストールされている場合があります。続行する前に、次の (既定の) ディレクトリを確認してください。
<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
|