情况如下:主要项目A.和类库B. A参考B
项目B具有将被序列化的类。这些类在A中使用。现在,问题从项目A出现时我尝试从B序列化对象。抛出一个异常,表示A中的类无法序列化。这是一个奇怪的部分,因为在B中的类中我不能引用A中的那些。(将创建循环依赖)。
如何追踪问题?因为异常方法没有说明问题出现在哪里?
修改: 好的,我在 Kent Boogaart的小应用程序的帮助下找到了问题:D。我在项目A的类中有一个PropertyChanged监听器,它没有标记为Serializable - 我不想这样做。 (它会将该类序列化为正确的吗?)
我已通过以下链接解决了该事件的问题:.NET 2.0 solution to serialization of objects that raise events。 仍有问题,但可能类似。
PS:来自 Kent Boogaart
的优秀工具答案 0 :(得分:10)
我编写了一个名为sertool的工具,它会告诉您对象图中的哪些内容无法序列化以及如何引用它。
答案 1 :(得分:2)
首先需要将问题隔离到特定的类。然后,您可以实现自定义序列化并对其进行调试以找到真正的问题。
只是一个简单的实现,让您逐步完成整个过程:
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
[Serializable]
public class Test : ISerializable
{
private Test(SerializationInfo info, StreamingContext context)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test));
foreach (SerializationEntry entry in info)
{
PropertyDescriptor property = properties.Find(entry.Name, false);
property.SetValue(this, entry.Value);
}
}
[SecurityPermission(SecurityAction.LinkDemand, SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(Test));
foreach (PropertyDescriptor property in properties)
{
info.AddValue(property.Name, property.GetValue(this));
}
}
}
Kent的工具看起来也非常好,毫无疑问会帮助你。
答案 2 :(得分:1)
也许B中的对象使用不属于A或B的类/接口来存储对A中对象的引用,例如,如果B使用对象(System.Object)引用来存储来自A的对象
答案 3 :(得分:0)
假设TA和TB是在A和B中定义的类型。假设有一个接口我在B或B和A参考的汇编中。 TA实施I. TB具有I型公共可设置属性,名为P.
您现在可以执行此操作:
TB b = new TB();
b.P = new TA();
由于TA实现了我,这是可能的。
现在,您的对象图具有一个类型的实例,该实例可能无法序列化并且来自程序集A.