在 WCF 中保留对象引用的问题

发布于 2024-11-19 13:40:37 字数 2644 浏览 8 评论 0原文

我试图确保在通过 WCF 序列化时保留我的对象引用,但我重写的 DataContractSerializerOperationBehavior 上的 CreateSerializer 从未被调用。任何人都可以帮我解决这个问题吗?

这是我的代码:

自定义 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);

I'm trying to ensure that my object references are preserved when serialized over WCF, but the CreateSerializer on my overriden DataContractSerializerOperationBehavior is never called. Can anybody help me out with this.

This is my code:

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

Starting service host:

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

Creating channel:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橘寄 2024-11-26 13:40:37

这可能与选择使用哪个串行器有关。删除所有其他序列化器并添加您的序列化器:

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

It maybe has to do with the selection of which serializer is used. Remove all other serializers and add yours:

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));
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文