如何影响Message.GetBody <t>()</t>的反序列化行为

时间:2011-02-01 22:37:53

标签: wcf serialization datacontractserializer

我对DataContractSerializer有相当多的使用经验,并使用IDataContractSurrogate处理自定义类型序列化。今天,我已经了解了.NET 4.0中的新DataContractResolver,它似乎提供了一个类似且更松散耦合的IDataContractSurrogate实现。

我遇到的问题是我需要提供一些调用Message.GetBody()时使用的自定义de / serialization行为。

有问题的消息有效负载具有(除其他外)返回“对象”的公共读/写属性。举例:

public class MessageContents
{
   public int SomeValue { get; set; }
   public object SomeData { get; set; }
}
...
MessageContents entity = new MessageContents { SomeValue = 1, SomeData = new Whatever() };
Message entityMessage = Message.CreateMessage(
   MessageVersion.Soap12WSAddressing10,
   String.Format("{0}Request", operation),
   entity);
...
entityMessage.GetBody<MessageContents>()

GetBody&lt;&gt;()调用抛出正常的“无法反序列化无法识别的类型'无论''预期。直接使用DataContractSerializer时,我没有解决问题的方法,但由于GetBody&lt;&gt;()使用自己的DataContractSerializer,我该如何影响这种反序列化行为?

我直接处理Messages的原因是因为有问题的服务接口正在返回大量的流数据,WCF要求我与Message类型形成我的操作合同。

我尝试将DataContractSerializerOperationBehavior行为添加到我的服务接口(对于每个操作),但注册的DataContractResolver永远不会被触发。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Message.GetBody<T>(XmlObjectSerializer)方法并传递DataContractSerializer类的正确配置的实例:

var knownTypes = new string[] { "Whatever" };
var serializer = new DataContractSerializer(typeof(MessageContents), knownTypes);

MessageContents contents = message.GetBody<MessageContents>(serializer);

相关资源: