2011-09-27 87 views
4

我正在使用EWS来开发我的电子邮件客户端。我发现,如果我存储项目Id在视图状态会导致异常说:如何在视图状态下存储对象?

在大会“Microsoft.Exchange.WebServices类型“Microsoft.Exchange.WebServices.Data.ItemId”,版本= 14.0.0.0,文化=中立,PublicKeyToken = 31bf3856ad364e35'未标记为可序列化。

如果我存储ItemId像字符串:

ViewState["itemId"] = id.ToString(); 

,然后尝试投退,

ItemId id = (ItemId)ViewState["itemId"]; 

它说我不能从字符串转换为ItemId。任何想法?

回答

3

正如错误消息所示,除非标记为可序列化,否则无法将对象存储在viewstate中。

查看文档here,似乎ItemId类具有一个UniqueId属性,该属性是一个字符串,并且该构造函数接受字符串'uniqueId'参数。

那么,你可以将uniqueId存储在viewstate中,并使用构造函数重新生成对象吗?

6

您正在存储字符串并期待ItemId。您应该存储为

ItemId itemId = new ItemId(); 
ViewState["itemId"] = itemId; 

但是,由于ItemId不可序列化,因此无法存储。要保存它让你的序列化类从项目Id继承并覆盖所有成员,并将其存储在ViewState中

[Serializable] 
public class MyItemId: ItemId { 
// override all properties 
} 

商店这样

MyItemId itemId = new MyItemId(); 
ViewState["itemId"] = itemId; 

和检索

MyItemId id=(MyItemId)ViewState["itemId"]; 
+1

该OP特别说:“我发现,如果我将itemId存储在viewstate中,它会导致一个异常,说:”Assembly.Microsoft.Exchange.WebServices,Version = 14.0.0.0中键入'Microsoft.Exchange.WebServices.Data.ItemId' ,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'未标记为可序列化。“” –

+0

详细的答案已更新 – hungryMind

+0

由于更新而将-1更改为+1。 –

0

您无法将其存储在ViewState中。

但是,您可以将它存储在Session中,因为它使用二进制格式化程序。

ViewState与LosFormatter类一起被序列化。