2011-09-20 12 views
8

Sự tồn tại của tùy chọn AsReference trong Protobuf-net và từ BinaryFormatter là một "đồ thị nối tiếp" dẫn tôi giả định rằng BinaryFormatter không duy trì tài liệu tham khảo và nó tạo bản sao của mọi đối tượng.Tính toàn vẹn tham chiếu trong BinaryFormatter

Nhưng tôi đã làm một số xét nghiệm và phát hiện ra rằng tất cả các tài liệu tham khảo trong một BinaryFormatter Serialize() hoặc Deserialize() cuộc gọi duy nhất được duy trì ngay cả đối với tham chiếu đệ quy.

Tôi có thể xác nhận rằng BinaryFormatter thực sự có duy trì tham chiếu không? Điều này khác với Protobuf-net như thế nào? Có vẻ như tôi hiểu "đồ thị tuần tự hóa" không chính xác? Tôi nên tìm kiếm điều gì khác?

Xin cảm ơn trước.

Trả lời

7

tl; dr; phiên bản - BinaryFormatter luôn giữ nguyên các tham chiếu.

Thực tế là BinaryFormatter là một "bộ nối tiếp đồ thị" đồng nghĩa với "nó giữ nguyên tham chiếu", vì đó là yêu cầu để tái tạo chính xác biểu đồ. Cách khác là một cây serializer (đó là nhất của họ; XmlSerializer, DataContractSerializer (không có một lựa chọn đặc biệt được kích hoạt), JavascriptSerializer và protobuf-net mà không AsReference đều dựa cây). Công cụ nối tiếp cây làm không thường bảo toàn tài liệu tham khảo (trừ khi chúng hoạt động một số thủ thuật, nghĩa là nếu bạn bật chế độ toàn đồ thị hoặc protobuf-net với AsReference). Cây serializers (mà không có voodoo kích hoạt) có xu hướng phát nổ trong một mớ hỗn độn với một mô hình đệ quy, mà làm cho chúng dễ dàng để phát hiện.