2010-11-08 2 views
1

Я пытаюсь разобрать ответ от службы OData REST. Когда ответ находится в формате JSON, легко использовать метод ReadAsJsonDataContract из стартового набора WCF REST. Однако кажется, что все сложнее, если ответ является фидом Atom. Это пример:Как десериализовать объект из корма OData 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 m: свойства?

ответ

3

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

+0

Vitek, благодарю вас за ответ. У меня есть служебная ссылка на мою службу OData, и она отлично работает с LINQ, поэтому мне даже не нужно вручную использовать DataContractSerializer в моем приложении. Так что это в основном для моей любопытства: в случае, если я хочу иметь полный контроль и десериализацию объектов из JSON или полезной нагрузки AtomPub, как мне это сделать? Мне удалось добиться этого с помощью JSON, но Atom-канал кажется более сложным, потому что он не использует исходную схему. Возможно, нет простого способа перестроить объект из такого фида, не пройдя через каждое отдельное поле? –

+0

Я вижу, в настоящее время я не знаю простого способа сделать это с помощью загрузок ATOM. Материализатор клиентской библиотеки иногда близок, но он приносит, вероятно, больше сложности, чем вы хотите. Поэтому, если вам действительно нужно это сделать, то ваш лучший парсер, основанный на некоторой библиотеке синтаксического анализа XML (XLinq легко). –

+0

Я вижу. Тогда, я думаю, я буду придерживаться стандартных вариантов: используя LINQ или Json. –

Смежные вопросы