Подтвердить что ты не робот

Могу ли я сериализовать таблицу данных или набор данных для передачи через веб-службу в С#?

Я использую веб-службу для запроса данных из таблицы. Затем я должен отправить его пользователю, который хочет его как DataTable. Могу ли я сериализовать данные? Или я должен отправить его как DataSet. Я новичок в веб-сервисах, поэтому я не уверен, что это лучший способ сделать это.

4b9b3361

Ответ 1

Вы можете отправить данные в виде строки xml из набора данных DataSet.GetXml()

И чем пользователь может десериализовать его с помощью DataSet.ReadXml()

И получить datatable из набора данных DataSet.Tables

Удачи.

Ответ 2

Если вы разместите его как DataSet/DataTable, он все равно будет выполнять свою сериализацию (через IXmlSerializable, IIRC). Обратите внимание, что DataSet/DataTable не делают для хороших типов данных веб-сервисы, если вы хотите, чтобы служба была переносимой для других шаблонов (например, java-клиент и т.д.). Но вы можете просто разоблачить его как таковой, если хотите...;.NET будет заниматься переводом.

Ответ 3

Смотрите этот пост от Ричарда Блветта по причинам, почему вы, вероятно, не захотите этого делать.

EDIT: Чтобы суммировать вышесказанное:

  • Использование DataSet несовместимо. Он использует аннотации, которые имеют смысл только тогда, когда каждый конец ссылки использует стек Microsoft.
  • DataSet - довольно неэффективный класс для отправки данных по проводке - он содержит данные отслеживания изменений и метаданные.
  • Он вводит жесткую связь - изменения, сделанные на стороне обслуживания, которые могут даже не потребоваться клиенту, также должны отражаться на стороне клиента.

Ответ 4

Конечно. Оба DataTable и DataSet являются сериализуемыми, а также имеют функции ReadXml() и WriteXml(), которые вы также можете использовать.

Ответ 5

DataTable являются сериализуемыми, но существуют некоторые трюки для возврата нетипизированного DataTable через WebService.

Прежде чем метод веб-службы вернет заполненный 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;
}

Ответ 6

Вы можете перенести DataTable через веб-службу. Так что это, вероятно, ваш лучший вариант, потому что это то, что попросил клиент.

Ответ 7

Простейшим и наиболее интероперабельным способом является сериализация набора данных в XML с помощью метода GetXml(), а затем передать это как строку из веб-службы. Затем клиент может десериализовать его с помощью метода ReadXml().

Мы уничтожили сервис, который сделал это таким образом, и он отлично работал.

Альтернативой является раскрытие класса DataSet в службе и возврат объекта набора данных. Но это усложнит ситуацию, особенно если какой-либо клиент должен быть не .NET.

Ответ 8

Просто интересное замечание от здесь

И никогда, никогда, никогда не отправляйте экземпляр System.Data.DataSet по проводке. Никогда не было, не сейчас, и никогда не будет никаких оснований когда-либо отправлять какой-либо экземпляр этого типа. Он находится за пределами массива и делает объект передачи данных стоимостью 10 000 кажутся легкими. Тот факт, что что-то сериализуемо, не означает, что это должно быть.