2010-03-08 32 views
9

Tôi có một lớp Bar có chứa List<Foo>, với cả hai FooBar triển khai ISerializable.Deserializing một lớp học có chứa một danh sách <T>: Tại sao Danh sách ban đầu đầy Nulls?

Khi deserializing Bar, List<Foo> ban đầu được điền đầy (số chính xác) null s; sau đó, khi thoát khỏi cỗ máy khử giải trình tự, Bar, mỗi sốcủa ctor deserialization được gọi là, điền vào List<Foo> với (chính xác deserialized) Foo s.

Tại sao điều này lại xảy ra? Tôi không thể sao chép nó trong một dự án thử nghiệm: bất cứ điều gì tôi đã thử đã dẫn đến các lò vi sóng khử trùng Foo được gọi là trước ctor Bar. Đây thực sự là hành vi tôi muốn, vì tôi cần danh sách được điền để thực hiện một số việc khởi tạo cho các yêu cầu Bar!

Bất kỳ ai cũng có ý tưởng về điều gì có thể khiến cho Foo giây bị hủy kích hoạt muộn? Cảm ơn!

+2

Ngẫu nhiên, tôi đã có thể thực hiện việc khởi tạo yêu cầu sau khi deserializing nhưng trước khi trở về, sử dụng một phương thức với [OnDeserializedAttribute] (xem http://msdn.microsoft.com/en-us/library/system.runtime. serialization.ondeserializedattribute% 28v = VS.90% 29.aspx). –

+1

Xem thêm http://stackoverflow.com/questions/1097797/custom-net-serialization-doesnt-seem-to-work; mặc dù không có câu trả lời tốt hơn ở đó. –

Trả lời

5

Đó là logic. Các deserializer deserialized nó đối tượng của đối tượng, sau đó tham khảo sau đây. Vì vậy, đầu tiên nó thiết lập danh sách với không gian X ... mà thực sự tất cả là NULL.

Sau đó, nó đi vào và deserializes đối tượng của đối tượng, đưa chúng vào các tài liệu tham khảo thích hợp.

Tất cả các kiểm tra vv logic từ bạn CHỈ nên chạy SAU KHI deserialization đã hoàn thành - theo định nghĩa bạn phải luôn luôn có một phần/không hợp lệ tiểu bang trong khi deserializer chạy.

Vấn đề lý do tại sao mọi thứ được thực hiện trễ là có thể cho rằng kịch bản thử nghiệm của bạn dễ dàng hơn nhiều so với dữ liệu thực, vì vậy điều gì đó làm cho bộ nối tiếp "biến thứ tự" ở phía sản xuất.

+0

Điều đó không có ý nghĩa với tôi. Hoặc serializer đang đi qua từng đối tượng, trong trường hợp đó, test case cũng sẽ hoạt động giống như Bar, hoặc nó đang nhìn vào đồ thị đối tượng và bắt đầu ở phía dưới, trong trường hợp Bar sẽ hoạt động khác nhau. –

+1

Và trong mọi trường hợp, nó không làm những gì tôi mong đợi, đó là bắt đầu với Bar; sau đó khi nó đạt đến danh sách các Foos, deserialize mỗi Foo; sau đó tiếp tục với Bar. –

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