我可以序列化数据表或数据集以通过C#中的Web服务进行传输吗?

我正在使用Web服务来查询表中的数据。 然后我必须将它发送给想要它作为DataTable的用户。 我可以序列化数据吗? 或者我应该将其作为A DataSet发送。 我是Web Services的新手,所以我不确定最好的方法。

您可以通过DataSet.GetXml()将数据作为xml字符串从数据集发送

并且用户可以使用DataSet.ReadXml()反序列化它

并通过DataSet.Tables从数据集中获取数据表

祝好运

如果将它公开为DataSet / DataTable ,它将自行执行自己的序列化(通过IXmlSerializable ,IIRC)。 请注意,如果您希望将服务移植到其他模式(即Java客户端等),则DataSet / DataTable不会在Web服务上创建良好的数据类型。 但是如果你想……你可以简单地公开它; .NET将处理翻译。

请参阅Richard Blewett的这篇文章 ,了解您可能不想这样做的原因。

编辑:总结以上内容:

  • 使用DataSet不可互操作。 它使用的注释只有在链接的每一端都使用Microsoft堆栈时才有意义。
  • DataSet是一种非常低效的类,用于通过网络发送数据 – 它还包含更改跟踪数据和元数据。
  • 它引入了紧密耦合 – 客户端甚至可能不需要在服务端进行的更改也必须反映在客户端。

当然。 DataTable和DataSet都是可序列化的,它们也可以使用ReadXml()和WriteXml()函数。

DataTable是可序列化的,但存在一些通过WebService返回无类型DataTable的技巧。

在Web服务方法返回填充的DataTable之前(在服务端),它必须已分配属性TableName。 如果在OperationContract DataTable中接收到类型化DataTable的引用,则序列化将失败,并且Messaga就像“”服务器没有提供有意义的回复; 这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的“。

这意味着您应该填充创建的DataTable,例如使用方法Merge(或手动)。 以下是此类DataContract实现示例;

 DataTable IHorizonCLService.RetrieveChangeLog(int iId) { DataTable dt = new DataTable(); //create new DataTable to be returned by this web method dt.Merge(HorMan.RetrieveChangeLog(iId)); //get typed DataTable and fills the DataTable dt.TableName = "SurChangeLogHor"; //assigns name return dt; } 

您可以通过Web服务传输DataTable。 所以这可能是你最好的选择,因为这是客户要求的。

最简单且最具互操作性的方法是使用GetXml()方法将数据集序列化为XML,然后将其作为字符串从Web服务传递。 然后,客户端可以使用ReadXml()方法对其进行反序列化。

我们已经消费了这样做的服务,而且效果很好。

另一种方法是在服务中公开DataSet类,并返回数据集对象。 但这会使事情变得复杂,特别是如果任何客户端应该是非.NET的话。

这是一个有趣的评论

并且,永远不会,通过线路发送System.Data.DataSet的实例。 从来没有,现在也没有,并且永远不会有任何理由在任何地方发送任何此类型的实例。 它超出了大规模,使10,000属性数据传输对象看起来很轻巧。 事物是可序列化的事实并不意味着它应该是。