C# 如何通过WCF传递通用对象

C# 如何通过WCF传递通用对象,c#,wcf,silverlight,web-services,serialization,C#,Wcf,Silverlight,Web Services,Serialization,是否可以在不从一个根继承的情况下传递泛型对象(泛型是指具有DataContract,而不是C#generic collection的任何对象)?目前我有这样的想法: [OperationContract] void Save(GenericObject o); [DataContract] [KnownType(typeof(ClassA))] [KnownType(typeof(ClassB))] class GenericObject {.... [DataContract] class

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

[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) 工作正常,但无效保存(对象o)不起作用


我正在使用Silverlight作为客户端。

是的,您可以为WCF项目使用通用的
消息类型,实际上,它可以是任何类型。但是,这会给您带来很多工作,无论是在创建消息对象的客户端(您基本上必须手动创建组成通用消息的XML),还是在服务器端,因为您不能再依赖漂亮的XML序列化/反序列化。您正在处理的是基本的、原始的尖括号(纯XML)

它是有效的,它可能是一个解决方案——但也许还有其他更优雅、更有用的解决方案?真的需要继承吗?考虑一下你的系统设计


Marc

下面是您的回复。如果您想了解更多信息,我们可以深入了解ClassA、ClassB以及您的GenericObject的外观,这可能会有所帮助。以及为什么要传递泛型对象而不是ClassA/B/C等。我要传递泛型对象,因为我有大量的对象集合(ClassA/B/C),这些对象存储在数据库之上创建的虚拟文件系统中。因此,我使用两种方法来存储/检索它们:Save()/Load(),而不是具有完全相同签名的SaveClassA/SaveClassB/SaveClassC(除了类型)。不,继承是绝对不必要的-它的唯一目的是为将泛型对象传递给存储服务提供解决方法。但是,由于项目越来越大,我们无法从单个根继承大多数DataContract对象。marc_是正确的。接收消息类型将允许您使用任何类型,而不考虑继承。我也同意你可能会想一想为什么你在这里使用WCF服务。如果您只是将数据访问层移动到WCF服务,那么您就没有抓住要点。