【问题标题】:How to Affect Deserialization Behavior of Message.GetBody<T>()如何影响 Message.GetBody<T>() 的反序列化行为
【发布时间】:2011-06-19 14:51:24
【问题描述】:

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

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

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

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,如何影响这种反序列化行为?

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

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

有人有什么建议吗?

【问题讨论】:

    标签: wcf serialization datacontractserializer


    【解决方案1】:

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

    var knownTypes = new string[] { "Whatever" };
    var serializer = new DataContractSerializer(typeof(MessageContents), knownTypes);
    
    MessageContents contents = message.GetBody<MessageContents>(serializer);
    

    相关资源:

    【讨论】:

    • 好吧...我现在正式羞愧地低下头并交出我的极客徽章。至少在今天。我发誓我查看是否存在允许使用自定义序列化程序的重载。我失败了。你没有。谢谢 Enrico,谢谢 StackOverflow。
    • 嘿,你只是需要一双新的眼睛来解决这个问题。这就是我们拥有社区的原因:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多