¿Puedo serializar una tabla de datos o un conjunto de datos para transferir a través de un servicio web en C #?

Estoy utilizando un servicio web para consultar datos de una tabla. Luego tengo que enviarlo a un usuario que lo quiera como DataTable. ¿Puedo serializar los datos? O debería enviarlo como un conjunto de datos. Soy nuevo en Servicios Web, por lo que no estoy seguro de cuál es la mejor manera de hacerlo.

Puede enviar los datos como una cadena xml desde un conjunto de datos por DataSet.GetXml()

Y que el usuario puede deserializarlo con DataSet.ReadXml()

Y obtenga los datos del conjunto de datos de DataSet.Tables

Buena suerte

Si lo expone como un DataSet / DataTable , de todos modos hará su propia serialización (a través de IXmlSerializable , IIRC). Tenga en cuenta que DataSet / DataTable no ofrece buenos tipos de datos en servicios web si desea que el servicio sea portátil a otras plataformas (es decir, un cliente Java, etc.). Pero simplemente puedes exponerlo como tal si quieres …; .NET se ocupará de la traducción.

Vea esta publicación de Richard Blewett por razones por las que probablemente no querría hacer esto.

EDITAR: Para resumir lo anterior:

  • El uso de DataSet no es interoperable. Utiliza anotaciones que solo tienen sentido cuando cada extremo del enlace usa la stack de Microsoft.
  • DataSet es una clase bastante ineficiente para enviar datos a través del cable: también contiene datos de seguimiento de cambios y metadatos.
  • Introduce un acoplamiento estrecho: los cambios realizados en el lado del servicio que el cliente podría incluso no necesitar, también deben reflejarse en el lado del cliente.

Por supuesto. Tanto DataTable como DataSet son serializables, y también tienen funciones ReadXml () y WriteXml () que también puede usar.

DataTable es serializable pero existen algunos trucos para devolver un DataTable sin tipo a través de WebService.

Antes de que el método de servicio web devuelva DataTable rellenado (en el lado del servicio), debe tener asignada la propiedad TableName. En caso de que si dentro de OperationContract DataTable recibe la referencia de DataTable tecleada, la serialización fallará con messaga como “” El servidor no proporcionó una respuesta significativa; esto puede deberse a una discrepancia en el contrato, un cierre de sesión prematuro o un error interno del servidor “.

Esto significa que debe llenar el DataTable creado, por ejemplo, utilizando el método Combinar (o manualmente). Aquí están los ejemplos de implementación de 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; } 

Puede transferir DataTable a través de un servicio web. Entonces esa es probablemente su mejor opción, porque eso es lo que pidió el cliente.

La forma más sencilla e interoperable es serializar el conjunto de datos a XML con el método GetXml (), luego pasarlo como una cadena del servicio web. El cliente puede deserializarlo con el método ReadXml ().

Hemos consumido un servicio que lo hizo de esta manera, y funcionó muy bien.

La alternativa es exponer la clase DataSet en el servicio y devolver el objeto de conjunto de datos. Pero esto complicará las cosas, especialmente si cualquier cliente debe estar fuera de .NET.

Solo un comentario interesante desde aquí

Y, nunca, nunca, nunca envíe una instancia de System.Data.DataSet a través del cable. Nunca ha habido, no hay ahora, y nunca habrá ninguna razón para enviar una instancia de este tipo a ninguna parte. Es más que masivo y hace que el objeto de transferencia de datos de 10.000 propiedades parezca ligero. El hecho de que algo sea serializable no significa que deba serlo.