繁体   English   中英

Base64反序列化期间的空引用异常(C#)

[英]Null reference exceptions during Base64 deserialization (C#)

我使用以下方法序列化和反序列化.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框架创建的实体类(也称为Serializable),其中每个实体类都是从我没有源代码的基类派生的。

使用实体类的实例时,它完成序列化而没有异常,但反序列化总是在执行formatter.Deserialize()时抛出空引用异常。

我不太熟悉序列化的过程,但我认为这个问题必定是由目标对象状态中的异常引起的。 在序列化之前,对象必须满足一组标准标准吗?

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

蒂姆,谢谢

更新:

经过进一步的实验,我想我已经找到了问题的原因。 目标物体具有通过如上述未标记为可序列,另一个类处理的事件此篇

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

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

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

您可能想要考虑使用像DataContractSerializerXmlSerializer ,protobuf-net或NetDataContractSerializer - 这些都做类似的工作,但因为它们在公共属性(而不是字段)上工作,它们往往更有效 - 事实上很多都有内置支持这些方法用作DTO。

你可以在ORM基类组件上使用Reflector吗? 可能存在一些导致异常的自定义反序列化代码(即它实现了ISerializable接口)。 如果您能找到这种情况,以及它正在做什么,您可能能够在子类的实例中设置足够的状态以防止它发生。 另一方面,如果它有一个bug,那么你有点不走运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM