如何在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类进行序列化。