我可以序列化数据表或数据集以通过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属性数据传输对象看起来很轻巧。 事物是可序列化的事实并不意味着它应该是。