【问题标题】:How to pass a generic object through WCF如何通过 WCF 传递通用对象
【发布时间】:2009-05-14 00:20:07
【问题描述】:

是否可以在不从一个根继承的情况下传递泛型对象(泛型是指DataContract 的任何对象,而不是 C# 泛型集合)?目前我有这样的事情:

[OperationContract]
void Save(GenericObject o);

[DataContract]
[KnownType(typeof(ClassA))]
[KnownType(typeof(ClassB))]
class GenericObject {....

[DataContract]
class ClassA: GenericObject {....


[DataContract]
class ClassB: GenericObject {....

一切都很好,但是项目变得更大了,我真的负担不起从一个类派生所有这些合同。

我不想为服务添加专门的方法。 作为一种解决方法,我可以通过 DataContractSerializer 手动将类序列化为 string 或 byte[] 并在服务器端对它们进行反序列化:void Save(byte[] serializedObject) 但这有点麻烦。

我注意到我可以轻松返回通用对象,例如 对象加载(字符串 id) 工作得很好,但 void Save(object o) 没有。

我使用 Silverlight 作为客户端。

【问题讨论】:

  • 您在下方有回复。如果您想了解更多信息,如果我们能够深入了解 ClassA、ClassB 以及您的 GenericObject 的外观,这可能会有所帮助。以及为什么要传递通用对象而不是 ClassA/B/C 等。
  • 我想传递一个通用对象,因为我有大量对象(ClassA/B/C),它们存储在数据库之上创建的虚拟文件系统中。因此,我使用两种方法来存储/检索它们:Save()/Load() 而不是具有完全相同签名(除了类型)的 SaveClassA/SaveClassB/SaveClassC。

标签: c# wcf silverlight web-services serialization


【解决方案1】:

是的,您可以为 WCF 项目使用通用的 Message 类型,它可以是任何东西,真的。但是,这给您带来了很多工作,无论是在客户端创建消息对象(您基本上必须手动创建构成通用消息的 XML)以及服务器端,因为您不能依赖关于漂亮的 XML 序列化/反序列化了。您正在处理基本的原始尖括号汤(直接 XML)。

它有效并且可能是一个解决方案 - 但也许还有其他更优雅和有用的解决方案?真的需要这种继承吗?想想你的系统设计。

马克

【讨论】:

  • 不,继承是绝对没有必要的——它的唯一目的是提供将通用对象传递给存储服务的解决方法。但由于项目变得越来越大,我们真的负担不起从单个根目录继承大部分 DataContract 对象。
  • marc_s 是正确的。接收消息类型将允许您使用任何类型,而不管继承如何。我也同意您可能会考虑为什么要在这里使用 WCF 服务。如果您只是将数据访问层移动到 WCF 服务,那么您就没有抓住重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
相关资源
最近更新 更多