我有一个客户端执行一些sql并以DataSet的形式获取结果。此DataSet被放入一个名为“ExecutionResults”的对象中,其中一个名为“Data”的Object类型的属性包含此DataSet。我希望通过调用WCF Web服务方法“SavePackageExecutionResults(ExecutionResults results)”来发送这个“ExecutionResults”对象,并且有服务将ExecutionResults的“Data”属性反序列化为DataSet。
我正在创建客户端和服务。我知道有两种方法可以让服务将ExecutionResults的“Data”属性反序列化为DataSet。一种方法是在客户端中引用ExecutionResults库,然后在生成代理时将使用相同的ExecutionResults类型。另一种方法是不引用包含“ExecutionResults”的库,并让代理创建自己的ExecutionResults类来实现IExtensibleDataObject。然后我可以用[KnownType(typeof(DataSet))]标记这个类,以便让服务将“Data”属性反序列化为DataSet。
完成我想要做的事情的正确方法是什么?在我看来,我上面提到的两种方式都涉及客户端和服务之间的某种级别的共享类型知识。也就是说,似乎在两种情况下我都强制要求服务知道System.Data.DataSet。我上面提到的场景之一是否比另一个更“邪恶”?
答案 0 :(得分:2)
查看DataSetSurrogate类: http://support.microsoft.com/kb/829740 它专为DataSet序列化而设计。
DataSetSurrogate类用作 任何DataSet的包装类 你想要远程。服务器 组件传递您的DataSet 想要DataSetSurrogate 构造函数然后传递 DataSetSurrogate类回到了 客户。在客户端, 使用DataSetSurrogate.ConvertToDataSet method用于提取DataSet 来自DataSetSurrogate类。