4

我正在使用以下方法来序列化和反序列化 .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() 时总是会抛出空引用异常。

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

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

谢谢,蒂姆

更新:

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

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

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

4

2 回答 2

1

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

您可能想考虑使用类似DataContractSerializer, XmlSerializer, protobuf-net 之类的东西,或者也许NetDataContractSerializer- 这些都做类似的工作,但是因为它们在公共属性(而不是字段)上工作,所以它们往往更有效 - 而且确实有很多内置支持这些方法用作 DTO。

于 2010-01-28T16:34:32.683 回答
0

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

于 2010-01-28T16:35:12.117 回答