代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

DataContractSerializer事件/委托字段出现问题

  •  6
  • Navaneeth K N  · 技术社区  · 14 年前

    在我的WPF应用程序上,我正在使用 DataContractSerializer 要序列化对象。我注意到它无法序列化具有事件或委托声明的类型。考虑以下失败代码:

    [Serializable]
    public abstract class BaseClass
    {
        public string Name { get; set; }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }
    
    public class DerivedClass : BaseClass
    {
        public int Age { get; set; }
    }
    
    
    class Program
    {
        static void Main(string[] args)
        {
            DerivedClass derivedClass = new DerivedClass {Name = "Test", Age = 10};
            derivedClass.PropertyChanged += (sender, eventArgs) => Console.WriteLine("hello");
    
            DataContractSerializer serializer  = new DataContractSerializer(typeof(DerivedClass));
            using(FileStream stream = new FileStream("c:\\test.txt", FileMode.Create, FileAccess.ReadWrite))
            {
                serializer.WriteObject(stream, derivedClass);
            }     
        }
    }
    

    这条消息失败了

    类型 'System.DelegateSerializationHolder+DelegateEntry' 带数据合同名称 'DelegateSerializationHolder.DelegateEntry: http://schemas.datacontract.org/2004/07/System ’ 不是预期的。不添加任何类型 静态已知到已知列表 类型-例如,通过使用 KnownTypeAttribute属性或 将它们添加到已知类型的列表中 传递到DataContractSerializer。

    我试图添加属性,比如 [DataMember(IsRequired = false)] 在事件上指示它不应序列化,但不起作用。

    当我移除 [Serializable] 属性来自 BaseClass . 我想知道为什么这种行为?避免给予安全吗 [可序列化] 属性?

    .NET Framework版本:3.5 SP1

    1 回复  |  直到 13 年前
        1
  •  13
  •   Tim Cooper    13 年前
    [field:NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;
    

    这告诉了 DataContractSerializer ,“不要序列化自动生成的 EventHandlerList 此事件的字段”。因此,任何附加到事件的对象实例都不会被视为被序列化的对象图的一部分。