WCF 自定义序列化程序不起作用 [英] WCF custom serializer do not work

查看:31
本文介绍了WCF 自定义序列化程序不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想用自定义序列化器替换 wcf 序列化器.谷歌搜索后,我找到了例子.但它不起作用.这是我的代码:替补:

Want to replace wcf serializer with a custom one. After googling I've found examples. But it do not work. Here is my code: Substitutor:

    internal class MySerializerSubstitutor : DataContractSerializerOperationBehavior
    {
        private static readonly MySerializer _serializer = new MySerializer();
        public MySerializerSubstitutor (OperationDescription operationDescription)
            : base(operationDescription)
        {

        }

        public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
        {
            return _serializer; //NEVER CALLED
        }

        public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
        {
            return _serializer; // NEVER CALLED
        }
    }

repolace 序列化器的行为

Behavior which repolace serializer

public class MySerializerBehavior : IOperationBehavior
{

.......

public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
    {
        var dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>();

        if (dcs != null)
            description.Behaviors.Remove(dcs);

        description.Behaviors.Add(new MySerializerSubstitutor(description)); //works fine
    }

........

}

和主持人:

protected override void ApplyConfiguration()
{
var behavior = new MySerializerBehavior()
                foreach (var op in Description.Endpoints.SelectMany(ep => ep.Contract.Operations))
                {
                    op.Behaviors.Add(behavior);
                }
}

这段代码有什么问题?

推荐答案

一个显而易见的问题是您无法从行为中替换行为.根据 MSDN:

One problem that is immediately visible is that you cannot replace a behavior from a behavior. According to MSDN:

所有 IOperationBehavior 方法都传递一个 OperationDescription对象作为参数.此参数仅供检查;如果你修改 OperationDescription 对象,执行行为是未定义.

All of the IOperationBehavior methods pass an OperationDescription object as a parameter. This parameter is for examination only; if you modify the OperationDescription object the execution behavior is undefined.

http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior.aspx

我不能 100% 确定您要完成什么,但这里有一个修改序列化程序行为属性的示例.

I am not 100% sure what you are trying to accomplish, but here is an example that modifies properties of the serializer behavior.

http://msdn.microsoft.com/en-us/library/system.servicemodel.description.datacontractserializeroperationbehavior.aspx

如果您需要比属性提供的更多自定义,您可以尝试替换 DataContractSerializerOperationBehavior.只需确保在调用 Open 之前添加它.请参阅此文章以添加新行为 http://msdn.microsoft.com/en-us/library/ms730137.aspx

If you need more customization than the properties provide you can try to replace the DataContractSerializerOperationBehavior. Just make sure you add it before calling Open. See this article for adding a new behavior http://msdn.microsoft.com/en-us/library/ms730137.aspx

这篇关于WCF 自定义序列化程序不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆