2010-08-13 31 views
6

Trên ứng dụng WPF của tôi, tôi đang sử dụng DataContractSerializer để sắp xếp đối tượng. Tôi quan sát thấy rằng nó không serialize các loại đã có một sự kiện hoặc tuyên bố đại biểu. Xem xét các mã thất bại sau:DataContractSerializer vấn đề với các sự kiện/trường đại biểu

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

này thất bại với thông điệp

Loại 'System.DelegateSerializationHolder + DelegateEntry' với tên hợp đồng dữ liệu 'DelegateSerializationHolder.DelegateEntry: http://schemas.datacontract.org/2004/07/System' không được mong đợi. Thêm bất kỳ loại nào không phải là được biết đến tĩnh vào danh sách các loại đã biết - ví dụ: bằng cách sử dụng thuộc tính KnownTypeAttribute hoặc thêm chúng vào danh sách các loại đã biết được chuyển đến DataContractSerializer.

Tôi đã cố gắng thêm các thuộc tính như [DataMember(IsRequired = false)] vào sự kiện để cho biết rằng nó không được tuần tự hóa, nhưng không có tác dụng.

Mọi thứ hoạt động khi tôi xóa thuộc tính [Serializable] khỏi BaseClass. Tôi tự hỏi tại sao hành vi này? Có an toàn để tránh cho thuộc tính [Serializable]?

.NET Framework phiên bản: 3.5 SP1

Trả lời

12
[field:NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 

này kể DataContractSerializer, "không serialize các tính năng tự động tạo ra EventHandlerList lĩnh vực cho sự kiện này". Vì vậy, bất kỳ trường hợp đối tượng nào gắn liền với sự kiện của bạn sẽ không được coi là một phần của đồ thị đối tượng đang được tuần tự hóa.

+0

tuyệt vời. Nó đã làm việc! Thông tin này có sẵn trên MSDN không? –

Các vấn đề liên quan