2010-08-13 63 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