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

我可以序列化数据表或数据集以通过C#中的Web服务进行传输吗?,c#,web-services,C#,Web Services,我正在使用web服务从表中查询数据。然后我必须将其发送给希望将其作为数据表的用户。我可以序列化数据吗?或者我应该将其作为数据集发送。我不熟悉Web服务,所以我不确定最好的方法 您可以通过Web服务传输数据表。所以这可能是你最好的选择,因为这是客户要求的 当然。DataTable和DataSet都是可序列化的,它们还具有ReadXml()和WriteXml()函数,您也可以使用。如果您将其公开为数据集/DataTable,它无论如何都会进行自己的序列化(通过IXmlSerializable,IIR

我正在使用web服务从表中查询数据。然后我必须将其发送给希望将其作为数据表的用户。我可以序列化数据吗?或者我应该将其作为数据集发送。我不熟悉Web服务,所以我不确定最好的方法

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

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

如果您将其公开为
数据集
/
DataTable
,它无论如何都会进行自己的序列化(通过
IXmlSerializable
,IIRC)。请注意,
DataSet
/
DataTable
如果您希望服务可移植到其他PATForm(如java客户端等),则不适合在web服务上使用良好的数据类型。但是,如果你想……的话,你可以简单地公开它。NET将负责翻译。

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

编辑: 综上所述:

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

您可以通过
dataset.GetXml()

然后用户可以使用
DataSet.ReadXml()对其进行反序列化

并通过
dataset.Tables


祝您好运

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

我们已经使用了一项这样做的服务,而且效果非常好


另一种方法是在服务中公开DataSet类,并返回DataSet对象。但是这会使事情复杂化,特别是当任何客户端都应该是非.NET时。

数据表是可序列化的,但是存在一些通过WebService返回非类型化数据表的技巧

在web服务方法返回填充的数据表(在服务端)之前,它必须分配属性TableName。如果OperationContract DataTable内部接收到类型化DataTable的引用,则序列化将失败,消息为“”,服务器未提供有意义的回复;这可能是由于契约不匹配、会话过早关闭或内部服务器错误造成的”

这意味着您应该填充创建的数据表,例如使用方法Merge(或手动)

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;
}

只是一句有趣的话

而且,永远不要通过网络发送System.Data.DataSet的实例。从来没有,现在没有,将来也不会有任何理由将这种类型的实例发送到任何地方。它不仅庞大,而且使10000属性数据传输对象看起来很轻。可序列化的事实并不意味着它可以可能是


请确保设置了表名,否则序列化时会出错。说真的,由于4年前发布的外部网站链接停止工作而导致向下投票?找到了重新定位的博客并更新了链接抱歉,我不清楚向下投票的协议和含义。我只是想指出链接已断开。向下投票已删除。@betitall-t汉克斯!事实上,自从我写了这个答案,现在流行的观点是,单句链接的答案是不受欢迎的,正是因为发生了什么-链接变得陈旧,所以答案不再增加价值。