代码之家  ›  专栏  ›  技术社区  ›  sirrocco

序列化问题

  •  3
  • sirrocco  · 技术社区  · 17 年前

    情况是这样的:主项目A和类库B。 参考文献B

    项目B具有将被序列化的类。这些类在A中使用。现在,当我从项目A尝试序列化B中的对象时,问题出现了。引发了一个异常,表示A中的类无法序列化。这是一个奇怪的部分,因为在B中的类中,我不能引用A中的类(将创建循环依赖项)。

    我怎样才能找到这个问题?因为异常方法没有说明问题出现在哪里?

    编辑: 好吧,我是在 Kent Boogaart 小应用程序:D。我在项目A中的一个类中有一个未标记为可序列化的PropertyChanged侦听器-我不想这样标记它。(它会将该类序列化到右边?)

    我通过以下链接解决了事件的问题: .NET 2.0 solution to serialization of objects that raise events . 还有一个问题,但可能是类似的。

    PS: 伟大的工具来自 肯特布加特

    4 回复  |  直到 10 年前
        1
  •  9
  •   Kent Boogaart    10 年前

    我写了一个叫做 sertool 这将告诉您对象图中无法序列化的内容以及如何引用它。

        2
  •  2
  •   Tsvetomir Tsonev    17 年前

    您首先需要将问题隔离到特定的类中。然后,您可以实现自定义序列化并对其进行调试,以找到真正的问题。

    只需一个简单的实现就可以让您逐步完成这个过程:

    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));
            }
        }
    }
    

    肯特的工具看起来也很不错,毫无疑问会帮助你。

        3
  •  1
  •   Sean    17 年前

    也许来自B的对象正在存储对来自使用类/接口的对象的引用,这些使用类/接口不是A或B的一部分,例如,如果B正在存储来自使用对象(System.Object)引用的对象

        4
  •  0
  •   Omer van Kloeten    17 年前

    假设TA和TB是在A和B中定义的类型。假设在B中有一个接口I,或者在B和引用之间有一个程序集。TA实现I.TB有一个公共的、可设置的属性,类型为I,名为P。

    现在可以这样做:

    TB b = new TB();
    b.P = new TA();
    

    因为TA实现了I,所以这是可能的。

    现在,对象图具有一个类型的实例,该类型可能无法序列化,并且来自程序集A。

    推荐文章