2011-07-13 27 views
0

我試圖確保在通過WCF序列化時保留我的對象引用,但從未調用我的覆蓋範圍上的CreateSerializer。有人能幫我解決這個問題嗎?在WCF中保留對象引用的問題

這是我的代碼:

定製DataContractSerializerOperationBehavior:

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)); 
     } 
    } 
} 

啓動服務主機:

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