2011-10-11 40 views
6

Gần đây tôi đã xem xét Chuỗi thời gian chạy và xuất hiện trên giao diện ISerializationSurrogate. Tôi nhầm lẫn về nó là phương pháp SetObject tuy nhiên.Tại sao ISerializationSurrogate.SetObject trả về một đối tượng cũng như lấy một đối tượng để điền?

Chữ ký là:

object SetObjectData(object obj, System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context, System.Runtime.Serialization.ISurrogateSelector selector)

và thông tin trợ giúp là:

Tóm tắt:

populates các đối tượng sử dụng các thông tin trong System.Runtime.Serialization .SerializationInfo.

Tham số:

obj: Đối tượng để cư trú.

thông tin: Thông tin để điền đối tượng.

ngữ cảnh: Nguồn mà đối tượng được deserialized.

bộ chọn: Bộ chọn thay thế nơi tìm kiếm đại diện tương thích bắt đầu.

Returns:

Các dân đối tượng deserialized.

Nếu obj là đối tượng để điền, tại sao nó trả về The populated deserialized object? Trong một số example từ MSDN, chúng cư trú objreturn null.

+0

Tôi đoán là nó cung cấp cho bạn cơ hội tạo một phiên bản mới và trả lại thay vì điền vào ví dụ hiện tại (nếu có một số trình cài đặt bị thiếu), nhưng bạn sẽ phải kiểm tra ... – Seb

+1

Nó sẽ xuất hiện nếu bạn trả về null, 'SurrogateSelector' trả về tham số' obj' nhưng nếu bạn trả về một đối tượng, đó là đối tượng được truyền lại. Có vẻ là một cách kỳ lạ để làm mọi thứ nếu bạn hỏi tôi. –

Trả lời

6

Kiểm tra này NET bài viết cột: http://msdn.microsoft.com/en-us/magazine/cc188950.aspx

Nó nói:

Chú ý rằng phương pháp SetObjectData có một kiểu trả về của Object. Điều này sẽ làm cho bạn nghĩ rằng SetObjectData thực sự có thể trả về một tham chiếu đến một kiểu đối tượng hoàn toàn khác. Tuy nhiên, các loại SoapFormatter và BinaryFormatter của Microsoft bỏ qua giá trị trả về này hoàn toàn, đó là lý do tại sao tôi trả về null trong ví dụ trước. Rõ ràng, có một lỗi ở đây; giá trị trả về sẽ cho phép SetObjectData trả về một đối tượng khác.

Microsoft đã lên lịch sửa lỗi này để sửa chữa. Nếu giá trị trả về là null, thì trình định dạng sẽ sử dụng đối tượng mà nó truyền cho SetObjectData. Nếu SetObjectData trả về một tham chiếu đối tượng, thì trình định dạng sẽ sử dụng đối tượng được trả về. Thật không may, cho đến khi lỗi này được sửa, bạn không thể deserialize một loại giá trị.

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