WCF自定义序列化程序不起作用

时间:2011-06-23 15:40:43

标签: wcf serializer

想要将wcf序列化程序替换为自定义序列化程序。 谷歌搜索后我找到了例子。但它不起作用。 这是我的代码: 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
        }
    }

复制序列化程序的行为

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

这段代码有什么问题?

1 个答案:

答案 0 :(得分:2)

立即可见的一个问题是您无法替换行为中的行为。根据MSDN:

  

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

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

我不是100%确定您要完成的任务,但这是一个修改序列化程序行为属性的示例。

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

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