2013-05-08 30 views
5

Trong ứng dụng 1 Tôi sắp xếp và sắp xếp lại và đối tượng và nó hoạt động tốt. Tuy nhiên tôi muốn deserialize một đối tượng từ ứng dụng 1 trong ứng dụng 2. Tôi thêm class định nghĩa đối tượng mà áp dụng 2. Khi tôi cố gắng deserialize nó tôi nhận được lỗi này:Chia sẻ một đối tượng được tuần tự hóa giữa các ứng dụng

Could not find assembly 'WindowsFormsApplication6, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Làm thế nào để chia sẻ một serialized đối tượng giữa hai ứng dụng sau đó?

+1

Nếu bạn đang sử dụng tuần tự hóa nhị phân .NET, bạn sẽ cần phải thực sự tham chiếu cùng loại cơ bản (như trong một từ cùng một DLL). Nếu bạn cũng cần phải chuyển sang một loại khác, bạn sẽ cần sử dụng một giao thức tuần tự hóa khác. –

+2

Bạn cần đặt định nghĩa của lớp được tuần tự hóa vào một thư viện lớp riêng biệt, mà bạn tham chiếu từ cả hai ứng dụng (do đó chia sẻ định nghĩa lớp). –

Trả lời

7

Đặt định nghĩa cho đối tượng tuần tự hóa thành một assembly riêng biệt và sau đó thêm một tham chiếu đến assembly chung cho từng dự án. (Trình định dạng sẽ thêm tham chiếu đến assembly trong dự án đầu tiên của bạn - chúng phải trên cùng một lớp, không chỉ là một bản sao giống hệt của lớp)

+0

Giải pháp tốt. Lưu ý rằng điều này tạo ra một khớp nối chặt chẽ vì cả hai phiên bản phải sử dụng cùng một assembly được tham chiếu. Bạn phải xem lại phiên bản. – Aphelion

5

Nếu bạn đang sử dụng BinaryFormatter, thì bao gồm toàn bộ gõ tên trong dữ liệu, trong đó bao gồm các hội đồng mà DTO là trong (loại luôn được xác định bởi hội đồng của họ). Một tùy chọn ở đây là tạo một thư viện DTO riêng biệt mà bạn tham chiếu từ mỗi - nhưng lưu ý rằng BinaryFormatter vẫn không đáng tin cậy khi nói đến phiên bản: Tôi đã thấy mọi người mất dữ liệu vì họ đã chỉnh sửa DTO của họ và mọi thứ đều ngừng hoạt động.

Tôi khuyên bạn nên sử dụng trình nối tiếp không phụ thuộc vào loại; ví dụ: XmlSerializer/DataContractSerializer/JSON.NET/ServiceStack's JsonSerializer hoặc protobuf-net. Tất cả những sẽ làm việc tốt nhưng quan trọng sẽ không chiến đấu bạn, theo hai cách khác nhau:

  • họ rất thân thiện với phiên bản
  • họ không quan tâm nếu bạn di chuyển các loại giữa cụm

Ngay cả với điều này, nó có lẽ thuận tiện nhất để duy trì một hội đồng DTO riêng biệt cho các loại được tuần tự hóa, nhưng nó không buộc bạn. Cuối cùng, vì các serializers này đều rất vui khi làm việc với hệ điều hành chéo/cross-version/cross-language/cross-CPU, thực tế chỉ là "các assembly khác nhau" là rất nhiều "meh, any".

Lấy chìa khóa: BinaryFormatter có thể dễ vỡ. Tôi không bao giờ đề xuất nó cho bất cứ điều gì ngoại trừ dữ liệu trong chuyến bay (ví dụ, remoting giữa hai trường hợp AppDomain). Tôi chắc chắn sẽ không sử dụng nó cho bất cứ điều gì đó là tồn tại trong bất kỳ thời gian, bởi vì tôi chỉ đơn giản là không thể đảm bảo rằng tôi sẽ có thể tải lại nó trong tương lai.

+0

Có bất kỳ serializers nào khác cho phép bạn tuần tự hóa đối tượng hình ảnh được lưu trữ như system.drawing.bitmap không? – AndyD273

+0

@Andy tôi sẽ nói rằng bạn đang giải quyết vấn đề sai ở đó. Lớp bitmap được thực hiện. Những gì bạn nên serializing là byte [] đó là payload hình ảnh thực tế (có lẽ trong một định dạng nổi tiếng). Hầu hết các serializers có thể xử lý một byte [] –

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