示例应用程序包括一个Suspension Manager类,它将会话状态存储在Dictionary中,但从不尝试存储除字符串之外的任何内容。
每当我存储除字符串之外的任何其他内容,然后触发序列化,我得到以下错误
不期望输入数据合约名称为“RuntimeType:http://schemas.datacontract.org/2004/07/System”的“System.RuntimeType”。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
我是否必须做其他事情才能在SessionState中存储其他类型?
答案 0 :(得分:8)
您需要做两件事:
首先,确保您所使用的类型(de)序列化使用DataContract
中的System.Runtime.Serialization
属性进行修饰,并确保其成员的装饰正确。例如在c#:
[DataContract]
public struct Product
{
[DataMember]
public Guid Id { get; set; }
[DataMember]
public DateTime ManufactureDate { get; set; }
[DataMember]
public decimal Cost { get; set; }
}
其次,在尝试(de)序列化之前,您需要调用SessionManager的AddKnownType<T>()
(T是您需要的类型)。
答案 1 :(得分:0)
查看SessionManager代码它只是字符串类型,猜你必须'自己动手' http://code.msdn.microsoft.com/windowsapps/ApplicationData-sample-fb043eb2/sourcecode?fileId=43552&pathId=6033729