在我的WPF应用程序中,我使用DataContractSerializer
来序列化对象。我发现它无法序列化获得事件或委托声明的类型。考虑下面的代码失败: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)]
这样的属性来表明它不应该被序列化,但是没有任何工作。
当我从BaseClass
中删除[Serializable]
属性时,一切正常。我想知道为什么这种行为?避免给[Serializable]
属性安全吗?
.NET framework版本:3.5 SP1
真棒。有效!这些信息在MSDN上可用吗? – 2010-08-13 12:19:27