2009-05-06 37 views
8

Tôi phải triển khai ISerializable trong một lớp dẫn xuất (để thực hiện một số serialization/deserialization tùy chỉnh) nhưng lớp cha được đánh dấu là [Serializable]. Việc serialization "works" (tôi có thể serialize và deserialize mà không có lỗi runtime) nhưng có vẻ như dữ liệu lớp cơ sở không được bảo toàn.Nếu tôi triển khai ISerializable trong một lớp học trẻ, cha mẹ có phải không?

Thực tế là tôi đang triển khai GetObjectData trong lớp dẫn xuất phủ nhận việc tuần tự hóa lớp cơ sở? Nếu vậy, tôi có phải thực hiện ISerializable trong lớp cơ sở và sau đó gọi base.GetObjectData (...) trong lớp dẫn xuất để bảo vệ dữ liệu hoặc là có một cách tốt hơn so với viết info.AddValue (...) 100 lần ?

chỉnh sửa> Cảm ơn bạn Tim. Bạn đã xác nhận những gì tôi nghi ngờ. Vấn đề chính nó đi thêm một bước nữa. Lớp cơ sở trong trường hợp của tôi thực hiện BindingList (T) mà chính nó không thực hiện ISerializable.

Tạm thời, đối với mỗi thuộc tính, tôi sẽ thử: Trong hàm tạo ISerializable base.Property = info.GetValue (...);

và trong GetObjectDate info.AddValue ("name", base.Property);

trừ khi một giải pháp tốt hơn được đưa ra bởi cộng đồng SO tuyệt vời.

Trả lời

6

tôi phải thực hiện ISerializable trong lớp cơ sở và sau đó gọi base.GetObjectData (...) trong các lớp có nguồn gốc

Yes. Ngay sau khi bạn triển khai ISerializable, mọi tự động tuần tự hóa sẽ bị tắt.

Tương tự như vậy, bạn sẽ cần triển khai hàm tạo tuần tự được bảo vệ trong cả lớp cơ sở và lớp dẫn xuất.

+1

Thông tin rất tốt, nhưng tôi phải làm gì nếu chính lớp cơ sở của tôi kế thừa từ BindingList (T) - không thực thi ISerializable (nhưng được đánh dấu là [Serializable])? –

+0

Trong quá khứ, tôi đã giải quyết vấn đề này bằng cách thêm mã vào hàm tạo tuần tự hóa của riêng tôi và phương thức GetObjectData. –

+0

yea, theo chỉnh sửa của tôi, tôi nghĩ đó là những gì tôi đã quyết định làm là tốt. Tôi chỉ hy vọng cho một giải pháp thanh lịch hơn thế này. –

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