使用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;
我将假设对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);
}