2013-06-17 14 views
7

Cuốn sách CLR Via C# trình bày một cách đơn giản để sao chép các đối tượng thông qua serialization nhị phân.StreamingContextStates.Clone thực sự làm gì?

Nó chỉ rõ StreamingContextStates.Clone khi tạo BinaryFormatter như vậy:

var formatter = new BinaryFormatter 
{ 
    Context = new StreamingContext(StreamingContextStates.Clone) 
}; 

The documentation for StreamingContextStates.Clone nói rằng nó

Chỉ định rằng đối tượng đồ thị đã được nhân bản. Người dùng có thể giả định rằng biểu đồ nhân bản sẽ tiếp tục tồn tại trong cùng một quy trình và an toàn để truy cập vào các xử lý hoặc các tham chiếu khác tới các tài nguyên không được quản lý.

Đủ công bằng - nhưng tôi thực sự không biết điều này thực sự có ý nghĩa gì. Theo cách nào, điều này thực sự thay đổi hành vi của BinaryFormatter? Bất cứ ai có thể liệt kê bất kỳ hiệu ứng cụ thể mà sử dụng lá cờ này có?

+3

Đối với hồ sơ, tôi ** ** mạnh mẽ đề nghị bạn nên tránh 'BinaryFormatter' trong, tốt, hầu hết các trường hợp này. Nó có một số thứ mà nó rất tiện dụng, nhưng tôi đã thấy * rất nhiều người * có * rất nhiều * đau gây ra từ điều này ... thực sự, các vấn đề trong 'BinaryFormatter' là một phần lý do tại sao tôi đã tham gia rất nhiều vào tuần tự hóa vài năm trở lại –

+3

Thuộc tính này được tái hiển thị trong 'ISerializable.GetObjectData (...)', vì vậy về mặt kỹ thuật, bất kỳ triển khai nào ** có thể về mặt lý thuyết ** chọn làm điều gì đó khác dựa trên giá trị 'StreamingContextStates'. Tôi không biết có bao nhiêu, nếu có, * làm *, mặc dù –

+0

@MarcGravell Thú vị, cảm ơn. (Và có lẽ mẫu đó nên được đưa ra khỏi CLR Qua C# cho phiên bản tiếp theo sau đó.;) –

Trả lời

2

Nối tiếp là chủ đề ở đây.
MS cung cấp một khung công tác "trừu tượng" để cho phép tuần tự hóa các đối tượng.
Trình định dạng nhị phân là một triển khai cụ thể của các khái niệm khung nhỏ đó.

Nhà phát triển có thể chọn sử dụng khái niệm khuôn khổ đó để tạo trình định dạng tùy chỉnh của riêng mình - hoặc -
Bản thân MS khi tạo tư duy khung nhỏ về việc triển khai tiếp theo.

Vì vậy, họ đã cung cấp những cờ đó như là một phần của khuôn khổ.

Để trả lời câu hỏi cụ thể của bạn: những lá cờ đó sẽ không có tác dụng đối với trình định dạng nhị phân vì nó đã được triển khai dưới dạng công cụ (nếu bạn muốn) để theo dõi đồ thị đối tượng và chuyển nó thành byte dữ liệu thô.
Nếu bạn tạo bộ nối tiếp riêng của mình, ví dụ có thể lưu đối tượng vào cơ sở dữ liệu hoặc tệp hoặc bộ nhớ dùng chung hoặc bất kỳ thứ gì - bạn sẽ muốn người dùng sử dụng trình nối tiếp của bạn để chỉ định cờ tương ứng.

Trừ khi tôi hoàn toàn hiểu lầm MS devs từ năm 2003 .. :) (mà có thể!)