2011-07-13 26 views
0

WCFでシリアル化されたときにオブジェクト参照が保持されるようにしようとしていますが、オーバーライドされたDataContractSerializerOperationBehaviorCreateSerializerは決して呼び出されません。誰もがこれで私を助けることができます。WCFでオブジェクト参照を保存する際の問題

これは私のコードです:サービスホストを起動する

public class ObjectGraphDataContractSerializerBehavior : DataContractSerializerOperationBehavior 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="ObjectGraphDataContractSerializerBehavior"/> class. 
    /// </summary> 
    /// <param name="operationDescription">The operation description.</param> 
    public ObjectGraphDataContractSerializerBehavior(OperationDescription operationDescription) 
     : base(operationDescription) 
    { 

    } 

    public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes) 
    { 
     return new DataContractSerializer(type, name, ns, knownTypes, 
      int.MaxValue /*maxItemsInObjectGraph*/, 
      false/*ignoreExtensionDataObject*/, 
      true/*preserveObjectReferences*/, 
      null/*dataContractSurrogate*/); 
    } 

    public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes) 
    { 
     return new DataContractSerializer(type, name, ns, knownTypes, 
      int.MaxValue /*maxItemsInObjectGraph*/, 
      false/*ignoreExtensionDataObject*/, 
      true/*preserveObjectReferences*/, 
      null/*dataContractSurrogate*/); 
    } 


    public static void SetDataContractSerializerBehavior(ContractDescription contractDescription) 
    { 
     foreach (OperationDescription operation in contractDescription.Operations) 
     { 
      operation.Behaviors.Add(new ObjectGraphDataContractSerializerBehavior(operation)); 
     } 
    } 
} 

カスタムDataContractSerializerOperationBehaviorチャネルの作成

var serviceHost = new ServiceHost(typeof (Service)); 
    serviceHost.AddServiceEndpoint(typeof (IService), new NetTcpBinding(), DummyUrl); 
    foreach (var endpoint in serviceHost.Description.Endpoints) 
     ObjectGraphDataContractSerializerBehavior.SetDataContractSerializerBehavior(endpoint.Contract); 
    serviceHost.Open(); 

m_ChannelFactory = new ChannelFactory<IService>(m_Binding, new EndpointAddress(m_Url)); 

ObjectGraphDataContractSerializerBehavior.SetDataContractSerializerBehavior(m_ChannelFactory.Endpoint.Contract); 

foreach (var behavior in endpointBehaviors) 
    m_ChannelFactory.Endpoint.Behaviors.Add(behavior); 

答えて

1

おそらく、どのシリアライザを使用するか選択する必要があります。その他のシリアライザをすべて削除して追加してください:

public static void SetDataContractSerializerBehavior(ContractDescription contractDescription) 
{ 
    foreach (OperationDescription operation in contractDescription.Operations) 
    { 
     DataContractSerializerOperationBehavior dcsob = operation.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     if (dcsob != null) 
     { 
      operation.Behaviors.Remove(dcsob); 
     } 
     operation.Behaviors.Add(new  ReferencePreservingDataContractSerializerOperationBehavior(operation)); 
    } 
} 
+0

CreateSerializerでブレークポイントに到達したことがないため、動作していたとは思えませんでした。しかし、それは動作します。 – Michael

関連する問題