我使用以下方法来序列化和反序列化 .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);
}
当使用标记有 [Serialized] 属性的简单类时,这些方法似乎工作得很好。
但我需要使用此代码来序列化由 ORM 框架创建的实体类(也可序列化),其中每个实体类都派生自我没有源代码的基类。
当处理实体类的实例时,它会毫无异常地完成序列化,但反序列化在执行 formatter.Deserialize() 时总是抛出空引用异常。
我对序列化的过程不是很熟悉,但我认为这个问题一定是由目标对象的状态异常引起的。对象在序列化之前是否必须满足一组标准条件?
任何其他调试建议将不胜感激。
谢谢,
蒂姆
UPDATE:
经过进一步的实验,我想我已经找到了问题的原因。目标对象具有由另一个未标记为可序列化的类处理的事件,如中所述这个帖子 http://quickduck.com/blog/2007/02/12/how-to-prevent-serialization-of-event-handlers/.
有趣的是,即使附加了事件处理程序,序列化也能正常工作——反序列化会失败。
但我已经通过暂时删除事件处理程序进行了测试,并且序列化和反序列化都正常工作,所以我认为这就是问题所在。但是,由于我无权访问声明事件的代码,因此我无法立即了解如何实现上述解决方案。我可能必须修改序列化过程以删除然后恢复事件处理程序。