c# - Base64反序列化过程中的空引用异常(C#)

标签 c# serialization base64 nullreferenceexception

我正在使用以下方法序列化和反序列化 .NET 对象:

public static string SerializeToBase64(object data)
{
    var stream = new MemoryStream();
    var formatter = new BinaryFormatter();
    formatter.Serialize(stream, data);
    stream.Position = 0;
    return Convert.ToBase64String(stream.ToArray());
}

public static object DeserializeFromBase64(string data)
{
    var stream = new MemoryStream(Convert.FromBase64String(data));
    stream.Position = 0;
    var formatter = new BinaryFormatter();
    return formatter.Deserialize(stream);
}

这些方法在处理标有 [Serializable] 属性的简单类时似乎工作正常。

但我需要使用这段代码来序列化由 ORM 框架创建的实体类(也被制成可序列化的),其中每个实体类都派生自一个我没有源代码的基类。

在处理实体类的实例时,它会无异常地完成序列化,但反序列化在执行 formatter.Deserialize() 时总是抛出空引用异常。

我对序列化的过程不是很熟悉,但我想这个问题一定是目标对象的状态出现了异常导致的。对象在序列化之前是否必须满足一组标准条件?

任何其他调试建议将不胜感激。

谢谢, 蒂姆

更新:

经过进一步的实验,我想我已经找到了问题的原因。目标对象具有由另一个未标记为可序列化的类处理的事件,如 this post 中所述。 .

有趣的是,serialaztion 可以正常工作,即使附加了事件处理程序 - 它是反序列化失败的。

但我已经通过暂时删除事件处理程序进行了测试,并且序列化和反序列化都可以正常工作,所以我认为这就是问题所在。但是,由于我无权访问声明事件的代码,因此无法立即了解如何实现上述解决方案。可能我必须修改我的序列化过程以删除然后恢复事件处理程序。

最佳答案

它是哪个ORM框架?请注意,ORM 生成的类型在与 BinaryFormatter 一起使用时往往特别令人讨厌,因为它们并不总是“POCO”:它们通常具有与 ORM 相关的字段 -所以独立创建它们有问题。简而言之,我对它在这种情况下不起作用并不非常感到惊讶。

您可能需要考虑使用类似 DataContractSerializerXmlSerializer、protobuf-net 或 NetDataContractSerializer 之类的东西 - 这些都做类似的工作,但因为它们在公共(public)属性(而不是字段)上工作,所以它们往往更有效 - 事实上,许多人已经内置支持将这些方法用作 DTO。

关于c# - Base64反序列化过程中的空引用异常(C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155466/

相关文章:

c# - 在我的 WPF 应用程序中捕获没有焦点的按键事件

c# - EF 6 使用 TPT 报错都具有相同的主键值

c++ - Boost::Serialization VS2015 Release Mode Mnly 编译报错

c# - 无法反序列化当前的 JSON 对象

c++ - 缓冲区到结构的转换

java - Java/Groovy 中的 Base64 编码

c# - 具有潜在空值的多列上的 Linq GroupBy

javascript - 在 Javascript 中将 Blob 同步转换为 base64 字符串

JavaScript Base 64 解码二进制数据不起作用

c# - 使用 LINQ 将日期/周列表拆分为 a 和 b 周