在我的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/