我在 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/