使用DataContractSerializer反序列化时出现错误

本文关键字:错误 DataContractSerializer 反序列化 使用 | 更新日期: 2023-09-27 18:08:31

当我反序列化我的对象回到它的原始类型时,我的对象总是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;

使用DataContractSerializer反序列化时出现错误

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

这里的问题是这样开始的:

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

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

除非您重载了ToString以返回一个DataContractSerializer能够反序列化的字节流(这是极不可能的),否则您很有可能在Object上使用ToString的实现,它将只返回类型的名称。

然后,你试图将这个字符串反序列化到你的对象中,这是行不通的。

你需要做的是正确地序列化你的对象到一个字节数组/MemoryStream,像这样:

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: 获取对象。
    // Reset the position of the stream so the read occurs in the right place.
    ms.Position = 0;
    // Read the object.
    var obj = (ProjectSetup) dcs.ReadObject(ms);
}