在WCF中返回已经序列化的类型

时间:2011-05-26 07:08:23

标签: c# wcf serialization

我想使用WCF来设置跨平台WebService。一个问题 - 实际上更多是性能问题 - 是我想要返回一个Type(让我们说事件),我已经在XML中使用了这个事件。所以我想避免反序列化为Event,然后WCF将它序列化为XML。知道如何管理吗?我想要实现的是像“WCF,这个方法返回一个Event-object但是我已经把它变成了XML,所以接受它并且不要强迫我先反序列化它,这样你就可以再次序列化它。” p>

丹尼尔

3 个答案:

答案 0 :(得分:1)

我认为您应该将Message类用于服务请求和响应,而不是DataContract定义:这应该可以让您更好地控制SOAP消息结构。如果你沿着这条路走下去,你需要创建一个自定义代理(see here开始)。

答案 1 :(得分:1)

执行消息(反)序列化的WCF组件是MessageFormatter

因此,您可以提供自定义IDispatchMessageFormatter。在SeralizeReply()方法(返回Message)中,您可以使用带有Message.CreateMessage()的{​​{1}}重载,并提供您从XML创建的XmlReader。就是这样。但是,有一些工作要做。你需要决定它是否值得。

答案 2 :(得分:0)

我不知道有什么方法可以做到这一点。除非你的Event很大,否则额外的步骤可能不会伤害你,至少它是本地的 - 如果它 大,你的主要问题是带宽,这两种方式都是相同的。

您可以在消息中将数据公开为XmlElement,这将避免此步骤 - 但是调用者需要知道将其识别为Event(正如他们将在mex中看到的那样) / wsdl是一个chunk-o'-xml)。

最终,这样做的部分原因是WCF是基于对象的模型,并且序列化器实际上可以通过许多技巧进行交换 - 因此就常规WCF模型而言,事实上,你有xml是无关紧要的:那可能实际上并不是像那样的东西。它需要该对象,因此它可以要求实际的序列化程序完成这项工作。