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