wcf - 如何影响 Message.GetBody<T>() 的反序列化行为

标签 wcf serialization datacontractserializer

我在 DataContractSerializer 和使用 IDataContractSurrogate 处理自定义类型序列化方面拥有丰富的经验。今天,我了解了 .NET 4.0 中的新 DataContractResolver,它似乎提供了类似且更松散耦合的 IDataContractSurrogate 实现。

我遇到的问题是我需要提供一些自定义的反/序列化行为,这些行为由对 Message.GetBody() 的调用使用。

有问题的消息有效负载(除其他外)有一个返回“对象”的公共(public)读/写属性。人为的例子:

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<>() 调用会引发正常的“无法反序列化无法识别的类型‘Whatever’”期望。当直接使用 DataContractSerializer 时,我可以毫无问题地解决问题,但由于 GetBody<>() 使用它自己的 DataContractSerializer,我如何影响这种反序列化行为?

我直接处理消息的原因是因为相关服务接口(interface)正在返回大量流数据,而 WCF 要求我与消息类型形成操作契约。

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

大家有什么建议吗?

最佳答案

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

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

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

相关资源:

关于wcf - 如何影响 Message.GetBody<T>() 的反序列化行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4868760/

相关文章:

.net - JSON 序列化需要很长时间

c# - 为什么 DataContractSerializer 会生成一个名称为 : "z:anytype"? 的节点

wcf - 为什么要在 Azure 上将 Web 服务部署为 Web 角色?

c# - wcf中的文件上传rest : special characters in stream gets replaced when reading

wcf - 验证 WCF 中的每个调用

c# - DataContract 无法序列化集合成员

c# - WebAPI 序列化程序序列化基类而不是笨拙的子类

java - 将图像文件从 Android 发送到 WCF REST 服务

grails - 呈现为JSON在Grails中不起作用

c++ - 当我将它放在 while 语句之外时,为什么我的 ofstream 不起作用?