序列化问题

时间:2008-10-08 10:39:10

标签: c# serialization

情况如下:主要项目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

的优秀工具

4 个答案:

答案 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.