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

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

这失败并显示消息



我试图在事件上添加诸如[DataMember(IsRequired = false)]之类的属性,以指示不应序列化该属性,但是没有任何效果。

当我从[Serializable]中删除BaseClass属性时,一切正常。我想知道为什么这种行为?避免提供[Serializable]属性是否安全?

.NET Framework版本:3.5 SP1

最佳答案

[field:NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;

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

关于c# - 事件/委托(delegate)字段的DataContractSerializer问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3476595/

10-12 12:43
查看更多