我对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永远不会被触发。
有人有任何建议吗?
答案 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);
相关资源: