在Serialize / Deserialize往返之后,DataServiceContext不可用

时间:2012-06-05 18:54:02

标签: c# windows-phone-7 serialization odata tombstoning

我在WP 7.1应用程序中遇到了墓碑式支持。我有一个长期存在的DataServiceContext实例,我使用DataServiceState帮助器对其进行序列化和反序列化。在反序列化时,我可以使用URI作为查找键从上下文中成功检索我的User类的实例。如,

var context= ... a deserialized DataServiceContext ...
var userIdentity = ... a URI that identifies a User instance ...
User user = null;
context.TryGetEntity(userIdentity.ToString(), out user);

但是如果我尝试在User实例上加载一个属性(我刚刚从上下文中拉出),如下所示:

context.BeginLoadProperty(user, "Foo", MyCallback, null);

上下文抛出InvalidOperationException,并显示消息“上下文当前没有跟踪实体”。似乎反序列化不会保留上下文的引用完整性。

我创建了一个简单的应用来演示此问题。从Skydrive下载:http://sdrv.ms/MhctLA

该应用使用http://services.odata.org/OData/OData.svc的示例数据服务。我手动运行dataSvcUtil以在ODataDemo.cs中创建代理。请注意,我必须在生成的代码中在类DemoService上添加DataContract属性,但是没有进行任何其他更改。

应用程序运行后,点击“数据服务上下文”按钮。以下页面将加载数据服务中的所有产品,随机选择一个从上下文中检索,缓存该产品的标识URI,然后加载产品的Category属性。

接下来,点击“序列化”按钮。该应用程序使用DataServiceState序列化上下文。

最后,点击“反序列化”按钮。应用程序反序列化上下文,然后针对复活的上下文尝试以下操作:

  1. 使用DataServiceContext.TryGetEntity和缓存的URI获取产品。
  2. 使用DataServiceContext.TryGetUri获取同一产品的URI。
  3. 加载产品的Category属性。
  4. 步骤1成功,而步骤2和3失败。 TryGetUri无法找到我刚刚从上下文中检索到的实体的描述符这一事实表明反序列化的上下文出现了问题。

    我做错了什么吗?或者这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

我会看看这个,并尽快回复你。感谢您分享您的repro项目,这将非常有用。

编辑:看起来这是一个错误。解决方法是丢弃上下文实例并将实例附加到新上下文。