2010-03-05 22 views
16

Tôi cần tránh việc tuần tự hóa thành viên của lớp Sự kiện vì khi sự kiện được xử lý bởi một đối tượng không được đánh dấu là Nối tiếp, việc tuần tự hóa sẽ không thành công.Làm thế nào để bỏ qua thành viên lớp học Sự kiện để tuần tự hóa nhị phân?

Tôi đã thử sử dụng thuộc tính NonSerialized trên thành viên của lớp Sự kiện nhưng không thể biên dịch được. dòng mã này:

<NonSerialized()> Public Event PropertyValueChanged() 

tạo ra lỗi sau:

Attribute 'NonSerializedAttribute' cannot be applied to 'PropertyValueChanged' because the attribute is not valid on this declaration type.

Public Event PropertyValueChanged() ' compiles but needs the extra handling described below 

Có một cách khác để tránh serializing thành viên tổ chức sự kiện?

Đây không phải là vấn đề nếu sự kiện không được xử lý và tôi có thể làm việc xung quanh nó bằng cách sao chép các đối tượng (và bỏ qua sự kiện) trước khi tuần tự hóa chúng. Chỉ cần tự hỏi nếu có một cách tốt hơn.

Cảm ơn.

+0

@Paul - re "vẫn không thành công"; chính xác thì bạn muốn làm gì? Tôi tự hỏi nếu thay đổi serializer sẽ là một lựa chọn tốt ở đây (nó không phải là khó như nó âm thanh, và có lợi ích phụ quá). Tùy thuộc vào bạn tất nhiên, nhưng tôi có thể nói về khu vực này trong * giờ * ... –

+0

@Marc: Cảm ơn bạn đã theo dõi. Tôi chỉ cần bỏ qua các sự kiện khi tuần tự hóa một lớp kể từ khi tuần tự hóa không thành công khi sự kiện được kết nối với một đối tượng không được tuần tự hóa. Các NonSerialized thuộc tính có ý nghĩa nhưng dường như không làm việc theo cùng một cách trong VB như trong C# ... Tôi nhận được một lỗi biên dịch ngay cả khi tôi trang trí một lĩnh vực sao lưu vào một tài sản sự kiện công cộng. Bạn có ý gì khi nói "thay đổi bộ nối tiếp"? Bạn có nghĩa là serialization tùy chỉnh hoặc một số khác, thư viện bên thứ 3? –

Trả lời

32

Trong C# bạn có thể thực hiện việc này như dưới đây, vì vậy tôi hy vọng dịch này giống hệt VB.

Chú giải này chỉ áp dụng cho trường giống như các sự kiện (tức là nơi bạn không phải của riêng bạn add/remove):

[field: NonSerialized] 
public event EventType EventName; 

Nếu không cái gì đó như:

[NonSerialized] 
EventType backingField; 
public event EventType { 
    add { backingField += value; } 
    remove { backingField -= value; } 
} 
+0

+1 Tôi nên biết, rằng sẽ không có cách nào đánh bại bạn để trả lời câu hỏi này. – kemiller2002

+0

Tôi đã học được điều gì đó mới :) Giải pháp tốt đẹp. – NebuSoft

+0

Rất tiếc, không có tùy chọn dịch sang VB ... –

5

Nó không phải là làm việc vì trình biên dịch thực sự tạo ra một trường sao lưu cho sự kiện. Để kích hoạt nó, chỉ cần tiền tố thuộc tính của bạn với lĩnh vực:

[field: NonSerialized] 
public event EventHandler PropertyValueChanged; 
+0

Điều này không có tác dụng đối với VB.NET vì một số lý do. –

0

Làm thế nào tôi đã thực hiện nó trong quá khứ cho các dự án là thực hiện các giao diện IXmlSerializable và kiểm soát serialization của tôi bằng tay. Tôi thấy điều này làm cho việc tuần tự hóa các điều khiển dựa trên GUI (với nhiều sự kiện) dễ dàng hơn nhiều.

IXmlSerializable

+0

'IXmlSerializable' không áp dụng cho việc tuần tự hóa nhị phân.Nó sẽ là 'ISerializable', rất khác. –

+0

Tôi đã bỏ lỡ nơi ông đã gắn thẻ nó cho Nhị phân. Sai lầm của tôi, vì một lý do nào đó, tôi cho rằng anh ta đã yêu cầu Xml. – NebuSoft