Как десериализовать объект из канала OData Atom? - PullRequest
1 голос
/ 08 ноября 2010

Я пытаюсь разобрать ответ от службы OData REST. Когда ответ в формате JSON, легко использовать метод ReadAsJsonDataContract из стартового комплекта WCF REST. Однако вещи кажутся более сложными в случае, если ответом является канал Atom. Это пример:

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<entry xml:base="http://localhost:64172/BookshopService.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <id>http://localhost:64172/BookshopService.svc/Books(89)</id>
  <title type="text"></title>
  <updated>2010-11-08T09:44:21Z</updated>
  <author>
    <name />
  </author>
  <link rel="edit" title="Books" href="Books(89)" />
  <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/OrderLines" type="application/atom+xml;type=feed" title="OrderLines" href="Books(89)/OrderLines" />
  <category term="BookshopModel.Books" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
  <content type="application/xml">
    <m:properties>
      <d:Id m:type="Edm.Int32">89</d:Id>
      <d:Author>Martin Fowler</d:Author>
      <d:Title>Analysis Patterns</d:Title>
      <d:Price m:type="Edm.Decimal">50.20</d:Price>
    </m:properties>
  </content>
</entry>

Таким образом, фактический объект сериализуется в элементе «content / m: properties». И, конечно, это не может быть обработано DataContractSerializer, который ожидает другую схему.

Кто-нибудь знает, какой метод можно использовать для десериализации содержимого элемента OData atom m: properties?

1 Ответ

3 голосов
/ 08 ноября 2010

Службы данных WCF имеют клиента, который можно использовать для получения ответов и материализации объекта CLR из них.Взгляните на класс System.Data.Services.Client.DataServiceContext и все связанные классы.Фактически, в VS вы можете «Добавить ссылку на службу» к вашим службам OData, и она будет генерировать клиентские классы для служб, а также производный класс из DataServiceContext для использования.Если у вас уже есть классы на стороне клиента, вы можете использовать метод DataServiceContext.Execute<T> для выдачи любого запроса и материализации его результатов в типы на стороне клиента.

...