2010-02-25 20 views
7

Trong .NET (ít nhất < = 2) có một vấn đề serializing các đối tượng nâng cao sự kiện khi các sự kiện đó được xử lý bởi một đối tượng không thể tuần tự hóa (giống như Windows Form).Do. NET 3/4 Cho phép các sự kiện bị nhị phân De/được tuần tự hóa?

Vì cách thức VB.NET thực hiện các sự kiện, khi bạn sắp xếp một đối tượng, các sự kiện của nó cũng được sắp xếp theo thứ tự (vì các sự kiện được thực hiện bằng cách sử dụng các trường ủy nhiệm multicast ẩn). Một tác dụng phụ của việc này là bất kỳ đối tượng nào xử lý các sự kiện được tạo ra bởi đối tượng đang được tuần tự hóa sẽ được coi là một phần của đồ thị đối tượng và sẽ được tuần tự hóa.

Một số cách giải quyết có thể được tìm thấy, thực hiện tuần tự tùy chỉnh hoặc sử dụng các đại biểu thay vì sự kiện:

Tuy nhiên không ai trong số họ có vẻ đáp ứng hoàn toàn các tác giả và người sử dụng.

.NET 3/4 có giải quyết được sự cố này không?

+3

Vấn đề này là không cụ thể cho VB.NET - đó là cách NET làm việc. –

+2

Tuy nhiên với C# ve có thể tìm thấy một giải pháp "linh hoạt" hơn bằng cách sử dụng '[Field: NonSerialized]'. Ít nhất, không có nhu cầu đặc biệt để viết mã trợ giúp bổ sung để giải quyết vấn đề. – serhio

+0

@serhio: không phải thuộc tính đó cũng hoạt động VB? Tại sao không? Tôi không nói về 'WithEvents'. –

Trả lời

3

Sự kiện được xử lý bằng cách tạo thành viên đại biểu. Nếu bạn tự xác định rõ ràng thành viên này, bạn sẽ có thể thêm thuộc tính NonSerialized vào nó. See this thread for a reference.

Ví dụ:

Public Delegate Sub MyEventDelegate() 

<NonSerialized()>Private m_MyEventDelegate As MyEventDelegate 

Public Custom Event MyEvent As MyEventDelegate 
    AddHandler(ByVal value As MyEventDelegate) 
     m_MyEventDelegate = DirectCast(System.Delegate.Combine(m_MyEventDelegate, value), MyEventDelegate) 
    End AddHandler 

    RemoveHandler(ByVal value As MyEventDelegate) 
     m_MyEventDelegate = DirectCast(System.Delegate.Remove(m_MyEventDelegate, value), MyEventDelegate) 
    End RemoveHandler 

    RaiseEvent() 
     If m_MyEventDelegate IsNot Nothing Then 
      m_MyEventDelegate.Invoke() 
     End If 
    End RaiseEvent 
End Event 
+0

Cảm ơn cú pháp. Tôi không nghĩ rằng tôi từng thấy cú pháp 'RaiseEvent'. –

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