2010-08-13 2 views
6

WPF uygulamasında, seri hale getirme nesnesini DataContractSerializer kullanıyorum. Bir etkinlik veya delege beyanı olan türlerin serileştirilmediğini gözlemledim. Aşağıdaki başarısız kodu göz önünde bulundurun: beklenmemektedir:DataContractSerializer ile ilgili sorunlar/temsilci alanları

[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); 
     }  
    } 
} 

Bu mesajla

'System.DelegateSerializationHolder + DelegateEntry' veri sözleşme adı 'http://schemas.datacontract.org/2004/07/System DelegateSerializationHolder.DelegateEntry' ile Tip başarısız olur. Bilinen türlerine göre bilinen türlerini ekleyin; örneğin, KnownTypeAttribute özniteliğini kullanarak veya , DataContractSerializer'a aktarılan bilinen türleri listesine ekleyin.

Olayın serileştirilmemesi gerektiğini belirtmek için olayda [DataMember(IsRequired = false)] gibi özellikler eklemeyi denedim, ancak hiçbir şey işe yaramadı.

BaseClass'dan [Serializable] özniteliğini kaldırdığımda her şey çalıştı. Bu davranış neden merak ediyorum? [Serializable] özniteliğinden kaçınmak güvenli midir?

.NET framework sürümü: 3.5 SP1

cevap

12
[field:NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 

Bu DataContractSerializer söyler, "Bu etkinlik için otomatik oluşturulan EventHandlerList alanını serialize yok". Bu nedenle, etkinliğinize eklenen herhangi bir nesne örneği, serileştirilmiş nesne grafiğinin bir parçası olarak kabul edilmeyecektir.

+0

harika. İşe yaradı! Bu bilgi MSDN'de mevcut mu? –