DataContractSerializer与事件/委托字段有关
在我的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); } } }
这失败并带有消息
不要求输入数据合同名称为“DelegateSerializationHolder.DelegateEntry: http : //schemas.datacontract.org/2004/07/System ”的’System.DelegateSerializationHolder + DelegateEntry’。 将任何静态未知的类型添加到已知类型列表中 – 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
我试图在事件上添加[DataMember(IsRequired = false)]
等属性,以表明它不应该被序列化,但没有任何效果。
当我从BaseClass
删除[Serializable]
属性时,一切正常。 我想知道为什么会这样做? 避免给出[Serializable]
属性是否安全?
.NET框架版本:3.5 SP1
[field:NonSerialized] public event PropertyChangedEventHandler PropertyChanged;
这告诉DataContractSerializer
,“不要为此事件序列化自动生成的EventHandlerList
字段”。 因此,附加到事件的任何对象实例都不会被视为要序列化的对象图的一部分。