2010-08-13 65 views
6

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

回答

12
[field:NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 

这告诉DataContractSerializer, “不连载此事件的自动生成EventHandlerList场”。因此,附加到事件的任何对象实例都不会被视为被序列化的对象图的一部分。

+0

真棒。有效!这些信息在MSDN上可用吗? – 2010-08-13 12:19:27