使用DataContractSerializer进行错误反序列化

时间:2011-09-13 10:24:00

标签: c# .net serialization datacontractserializer

当我将对象反序列化为原始类型时,我的对象始终为null

这是我的代码:

ProjectSetup obj = new ProjectSetup();

if (System.Web.HttpContext.Current.Session["ProjectSetup"] == null)
    setBookProjectSetup();

string toDeserialise = System.Web.HttpContext.Current.
    Session["ProjectSetup"].ToString();

DataContractSerializer dcs = new DataContractSerializer(typeof(ProjectSetup));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(toDeserialise));
obj = (ProjectSetup) dcs.ReadObject(ms, true);

return obj;

1 个答案:

答案 0 :(得分:0)

我将假设对setBookProjectSetup的调用在ProjectSetup中放置HttpSessionState的实例,其密钥为ProjectSetup

这里的问题始于:

string toDeserialise = System.Web.HttpContext.Current.
    Session["ProjectSetup"].ToString();

您随后使用toDeserialize字符串的内容作为反序列化的来源。

除非你重载ToString以返回DataContractSerializer能够反序列化的字节流(极不可能),否则你可能正在使用ToString的实现{ {1}},它只返回类型的名称。

然后,您试图将该字符串反序列化为您的对象,这不会起作用。

您需要做的是将对象正确序列化为字节数组/ MemoryStream,如下所示:

Object

此时,using (var ms = new MemoryStream()) { // Create the serializer. var dcs = new DataContractSerializer(typeof(ProjectSetup)); // Serialize to the stream. dcs.WriteObject(ms, System.Web.HttpContext.Current.Session["ProjectSetup"]); 将填充一系列表示序列化对象的字节。然后,您可以使用相同的MemoryStream

返回对象
MemoryStream