我使用以下方法来序列化和反序列化.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()时抛出空引用异常。
我对序列化过程不太熟悉,但我认为这个问题必定是由目标对象状态异常引起的。在序列化之前,对象必须满足一组标准标准吗?
任何其他调试建议都将不胜感激。
谢谢, 添
更新:
经过进一步的实验,我想我已经找到了问题的原因。目标对象具有由未标记为可序列化的另一个类处理的事件,如this post中所述。
有趣的是,即使附加了事件处理程序,serialaztion也能正常工作 - 它的反序列化失败了。
但我已经通过暂时删除事件处理程序进行测试,序列化和反序列化都正常工作,所以我认为这是问题所在。但是,由于我无法访问声明事件的代码,因此我无法立即了解如何实现上述解决方案。可能是我必须修改我的序列化过程以删除然后恢复事件处理程序。
答案 0 :(得分:1)
是哪个ORM框架?请注意,与BinaryFormatter
一起使用时,ORM生成的类型往往特别令人讨厌,因为它们并不总是“POCO”:它们通常具有与ORM相关的字段 - 因此创建它们独立有问题。简而言之,我不会非常感到惊讶,因为它在这种情况下不起作用。
你可能想考虑使用像DataContractSerializer
,XmlSerializer
,protobuf-net或者NetDataContractSerializer
这样的东西 - 这些都做类似的工作,但因为它们在公共财产上工作(而不是字段)他们倾向于更有效 - 事实上,许多人已经内置了对这些方法的支持,可以用作DTO。
答案 1 :(得分:0)
您可以在ORM基类程序集上使用Reflector吗?可能存在一些导致异常的自定义反序列化代码(即它实现了ISerializable
接口)。如果您能找到这种情况,以及它正在做什么,您可能能够在子类的实例中设置足够的状态以防止它发生。另一方面,如果它有一个错误,那么你有点不走运。