WCF DataContractSurrogate具有不同的非继承类型

时间:2011-04-09 05:51:43

标签: .net wcf datacontractserializer datacontractsurrogate

目标

为具有未知可枚举类型的服务动态公开RSS / Atom端点。该类型将通过反射找到,以构建联合终点。

方法

我正在使用.net 4.0

我正在反映一个dll暴露端点,即json,xml,soap。这一切都按我的意愿行事。 (因此,我使用代码来配置我的WCF设置。)

我现在正尝试通过我的服务公开的反射公开所有ICollection的rss端点,这样我就可以为每个返回ICollection的方法公开一个SyndicationFeed。

我相信我想使用datascontractsurrogate,并遵循msdn必须添加的内容。我已经连接了我的datacontractsurrogate并且我已经观察到它正在代理中的我的调试点。

我从svclog查看器中获得以下异常:

例外类型:

System.Runtime.Serialization.InvalidDataContractException, System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

消息:

Using surrogates with get-only collection properties is not supported.  Consider removing the surrogate associated with 'System.Collections.Generic.Dictionary`2[[System.Xml.XmlQualifiedName, System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.  

问题

  1. 从概念上讲,我的选择是什么 实现我想要实现的目标?
  2. 我可以保持输出SyndicationFeed类型的类型安全方式,而不是选择将adhoc写入xml字符串吗?

1 个答案:

答案 0 :(得分:1)

你为什么要代替词典呢?我不明白为什么你的方法,例如,不仅仅返回一个Object,甚至只返回ICollection,所以你使用你想要的任何DLL类型多态返回你想要的任何对象。

如果不进一步了解这种情况,我建议您也尝试使用DataContractResolver。请参阅this blog postthis samplethe MSDN page以开始使用。它本质上可以帮助您将一种类型映射到线上不同的xsi:type表示,这可能就是您想要的。

您确定已经用尽所有关于已知类型的选项吗?有关该主题的详尽处理,请参阅this blog post