【问题标题】:Getting error deserializing with DataContractSerializer使用 DataContractSerializer 反序列化时出错
【发布时间】:2011-09-13 10:24:00
【问题描述】:

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

【问题讨论】:

  • 你看到我在这里添加的答案了吗? stackoverflow.com/questions/7397754/… - 这能解决问题吗?另外:一般提示:永远不要“错误” - 给出准确,逐字错误
  • 顺便说一句; catch(Exception ex) {throw ex;} 没有任何好处,并且会造成伤害(它会破坏堆栈跟踪) - 避免这种情况。
  • 如何序列化对象?
  • 代码确实不完整。 @Marc +1,加上捕捉一般异常是一种很好的做法。

标签: c# .net serialization datacontractserializer


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 2013-03-03
    • 1970-01-01
    • 2011-09-29
    • 2021-02-13
    • 2013-06-01
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多