2012-02-10 32 views
5

Tôi cần tuần tự hóa một đối tượng bằng cách sử dụng BinaryFormatter với .NET 4.0 và gửi nó qua dây (thông qua SOAP dưới dạng mảng byte) tới một dịch vụ web chạy dưới .NET 3.5. Và ngược lại. Tôi đã thử nghiệm kịch bản này, và nó có vẻ hoạt động tốt.Các đối tượng có thể tuần tự hóa/deserialize trên các phiên bản khung công tác khác nhau không?

Có một số question cũ về kịch bản này trên SO, nói về .NET 1.x đến 2.0, điều này đã không khiến tôi tự tin về cách tiếp cận này.

Vì vậy, nó hoạt động trong khai thác thử nghiệm của tôi, nhưng tôi không thể kiểm tra mọi biến thể có thể có của đối tượng, vì vậy tôi cần một số nền tảng lý thuyết.

Như một quy luật, các đối tượng có thể tuần tự hóa/deserialize trên các phiên bản khung khác nhau không? Đây có phải là một kịch bản được chấp nhận hoặc một hack đã làm việc trong trường hợp của tôi?

+0

Bạn đang sử dụng loại serialization nào (Nhị phân, XML, JSON, v.v ...)? –

+0

Tôi nghĩ rằng bạn phải dừng lại là "AngryHacker" và trở thành "JollyHacker" để làm việc này tốt nhất :) –

+0

@JustinNiessner nhị phân. – AngryHacker

Trả lời

1

Nếu theo "nhị phân" bạn có nghĩa là BinaryFormatter, thì nó đã vô cùng không dung nạp giữa các phiên bản, vì nó được gắn chặt với siêu dữ liệu loại (trừ khi bạn làm việc thực sự khó với các ràng buộc tùy chỉnh). Vì vậy, chỉ đúng đáng tin cậy khi cả hai đầu đều sử dụng chính xác cùng các triển khai. Ngay cả việc thay đổi thuộc tính thành/từ một thuộc tính được tự động thực hiện là một thay đổi phá vỡ.

Đây không phải là lỗi của "nhị phân", mà là một tính năng của BinaryFormatter. Các trình tuần tự nhị phân khác không có vấn đề này. Ví dụ, protobuf-net hoạt động giữa hệ điều hành, giữa các khuôn khổ, vv - kể từ định dạng a: không quan tâm đến các kiểu cụ thể của bạn, và b: được cố định với một đặc tả được công bố.

Nếu bạn đang sử dụng BinaryFormatter cho hiện tại: thì IMO có, bạn nên kiểm tra rõ ràng mọi API. Vì mọi loại có thể thay đổi chi tiết triển khai. Và thật không may kể từ khi BF có thói quen kéo dữ liệu bất ngờ (thông qua các sự kiện, vv), ngay cả điều này cũng không nhất thiết phải xác thực việc sử dụng thực sự.

+0

Các đối tượng mà tôi đang chạy trên dây bị cô lập thành một hội đồng riêng biệt (được biên dịch thành .NET 3.5). Cả khách hàng và máy chủ đều có bản sao chính xác của hội đồng, vì vậy những thứ như thay đổi tài sản không phải là một mối quan tâm. Ngoài ra, các đối tượng là các đối tượng chuyển dữ liệu thuần túy, ví dụ: không có sự kiện hay bất cứ điều gì như thế. Tôi có an toàn trong kịch bản đó không? – AngryHacker

+1

@AngryHacker Tôi chào mừng bạn lập kế hoạch tốt và suy nghĩ về phía trước. Điều đó sẽ thực sự cô lập bạn khỏi một thế giới đau đớn ở đây. Với thiết lập đó, tôi sẽ * mong đợi * nó hoạt động. Nó sẽ ** bất ngờ ** tôi nếu điều đó thất bại, nhưng: đôi khi điều bất ngờ xảy ra. –

1

Nếu định dạng tuần tự là XML (SOAP) hoặc JSON, nó hoàn toàn không hoạt động. Tôi không chắc chắn làm thế nào một đối tượng serialized nhị phân sẽ phản ứng.

1

Vấn đề lớn nhất với tuần tự hóa là khi bạn có nguyên thủy không tồn tại. Địa ngục, vấn đề tồn tại khi đi đến một số loại trong mã nguồn gốc, do đó, nó không phải là một vấn đề duy nhất được tìm thấy trong các dịch vụ (giả định).

Là một "quy tắc", bạn có thể tuần tự hóa trên các phiên bản khung và thậm chí cho khách hàng được viết bằng Java, Delphi và COBOL (cung cấp một phiên bản với khả năng dịch vụ web) và miễn là bạn đã tiếp xúc với các đối tượng được tuần tự một cách thích hợp thông qua điểm cuối dịch vụ) .

Tôi đang cố gắng nghĩ rằng nếu có bất kỳ nguyên thủy trong .NET không có trong 1.x, vì chúng sẽ có vấn đề. Như bất kỳ đối tượng khung công tác mới nào, bạn có thể thử tuần tự hóa. Bạn có ít nguy hiểm hơn với 2.0 (có lẽ không tồn tại?)

Việc mở rộng thêm "serialization" của bạn là (ví dụ, các tiêu chuẩn như JSON, SOAP, vv - đơn giản hóa: JSON hoặc XML, ít nhất trong hầu hết các trường hợp) , bạn càng ít có vấn đề. Và, nếu bạn có vấn đề, bạn có thể mã hóa xung quanh proxy automagic, vv Khi bạn di chuyển về phía nhị phân, bạn có thể có một số không tương thích giữa một đối tượng serialized trong 4,0 với WCF và một khách hàng Remoting.

+0

Tôi tuần tự hóa với bộ nối tiếp nhị phân và truyền qua SOAP. Bạn có thể cung cấp một ví dụ (ngay cả một lý thuyết), nơi sẽ có một sự không tương thích? – AngryHacker

+0

Không được tắt tay. Nếu bạn đang tuần tự hóa các đối tượng miền của bạn (và không phải là công cụ từ .NET Framework) và dính vào nguyên thủy tồn tại kể từ 1.x (tránh các kiểu nullable), tôi không nghĩ bạn sẽ gặp vấn đề, thậm chí với serialization nhị phân. Về cơ bản, nếu bạn đang đi qua nhà nước (đối tượng cơ bản với getters và setters về tài sản và không nhiều khác) và gắn bó với nguyên thủy chung, bạn nên được tốt. –

+0

Và, về mặt kiến ​​trúc, bạn có thể hoàn nguyên về điểm cuối dựa trên SOAP cho các khách hàng 1.x của mình nếu bạn đã bị hỏng bên ngoài chế độ "đơn giản". :-) ::: Gotta yêu sự linh hoạt trong WCF. –

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