想要将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);
}
}
这段代码有什么问题?
答案 0 :(得分:2)
立即可见的一个问题是您无法替换行为中的行为。根据MSDN:
所有IOperationBehavior方法都传递OperationDescription 对象作为参数。此参数仅供检查;如果你 修改OperationDescription对象的执行行为 未定义。
http://msdn.microsoft.com/en-us/library/system.servicemodel.description.ioperationbehavior.aspx
我不是100%确定您要完成的任务,但这是一个修改序列化程序行为属性的示例。
如果您需要比属性提供的更多自定义,则可以尝试替换DataContractSerializerOperationBehavior。编辑:只需确保在调用Open之前添加它。请参阅此文章以添加新行为http://msdn.microsoft.com/en-us/library/ms730137.aspx