如何在viewstate中存储对象?

我正在使用EWS开发我的电子邮件客户端。 我发现如果我将ItemId存储在viewstate中,它将导致exception说:

在程序集“Microsoft.Exchange.WebServices,Version = 14.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”中键入“Microsoft.Exchange.WebServices.Data.ItemId”未标记为可序列化。

如果我将ItemId存储为字符串,如:

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

然后试着回头,

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

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

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

看一下这里的文档,似乎ItemId类有一个UniqueId属性,它是一个字符串,以及一个带有字符串’uniqueId’参数的构造函数。

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

你试过了吗:

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

http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.itemid.itemid(EXCHG.80).aspx

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

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

但是,由于ItemId不可串行化,因此无法存储。 要存储它,请使您的可序列化类inheritance自ItemId并覆盖所有成员并将其存储在ViewState中

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

像这样存储

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

并检索

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

您无法将其存储在ViewState中。

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

ViewState使用LosFormatter类进行序列化。