NetDataContractSerializer
サーバー側と同じようにカスタムシリアライザーを使用しています。NetDataContractSerializer
との違いはDataContractSerializer
、シリアライゼーションがタイプの追加情報を追加することです。
たとえば
DatacontractsSerializer
、次のようにシリアル化されます。
<Customer xmlns="http://www.contoso.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>Zighetti</FirstName>
<ID>101</ID>
<LastName>Barbara</LastName>
</Customer>
NetDataContractSerializer
同じオブジェクトを次のようにシリアル化します。
<Customer z:Id="1" z:Type="NetDCS.Person" z:Assembly="NetDCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns="http://www.contoso.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<FirstName z:Id="2">Zighetti</FirstName>
<ID>101</ID>
<LastName z:Id="3">Barbara</LastName>
</Customer>
より多くのタイプ固有の情報を誘導します。
あなたの場合、サーバーは知ってNetDataContractSerializer
いますが、クライアントは知りません。この動作を共有コード ライブラリに配置して、クライアントと共有する必要があります。次に、以下のコードを使用して、この enw 動作をクライアントに追加できます。
using (var client = new TestServiceClient())
{
// Get the channel factory
var factory = client.ChannelFactory;
// Attach the behavior
foreach (OperationDescription desc in factory.Endpoint.Contract.Operations)
{
DataContractSerializerOperationBehavior dcsOperationBehavior = desc.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (dcsOperationBehavior != null)
{
int idx = desc.Behaviors.IndexOf(dcsOperationBehavior);
desc.Behaviors.Remove(dcsOperationBehavior);
desc.Behaviors.Insert(idx, new WcfClient.NetDataContractAttribute.NetDataContractSerializerOperationBehavior(desc));
//return true;
}
}
// pass
client.PassInt(0);
// fail
client.PassGuid(Guid.NewGuid());
client.Close();
}
構成ファイルを介して動作をアタッチすることもできます。