在我的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
属性后,一切正常。我想知道为什么会这样做?避免提供[Serializable]
属性是否安全?
.NET framework版本:3.5 SP1
答案 0 :(得分:13)
[field:NonSerialized]
public event PropertyChangedEventHandler PropertyChanged;
这告诉DataContractSerializer
,“不要为此事件序列化自动生成的EventHandlerList
字段”。因此,附加到事件的任何对象实例都不会被视为被序列化的对象图的一部分。