如何从OData Atom提要反序列化对象?

时间:2010-11-08 13:22:35

标签: wcf odata datacontractserializer atom-feed

我正在尝试解析来自OData REST服务的响应。当响应采用JSON格式时,可以很容易地使用WCF REST入门工具包中的ReadAsJsonDataContract方法。但是,如果响应是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 个答案:

答案 0 :(得分:3)

WCF数据服务有一个客户端,可用于使用响应并从中获取CLR对象。查看System.Data.Services.Client.DataServiceContext类和所有相关类。 实际上,在VS中,您可以向OData服务“添加服务引用”,它将为服务生成客户端类,并为DataServiceContext生成派生类供您使用。 如果您已有客户端类,则可以使用DataServiceContext.Execute<T>方法发出任何查询并将其结果具体化为客户端类型。