2012-10-26 38 views
5

Tôi đang tuần tự hóa một số dữ liệu như trường và lớp tùy chỉnh để tạo dữ liệu nhị phân (mảng byte).Ngoại lệ Deserialization: Không thể tìm thấy lắp ráp

Sau đó, tôi muốn Deserialize nó trở lại từ dữ liệu nhị phân sang các trường và lớp.

Nhưng tôi có ngoại lệ. Nó sẽ làm việc tốt nếu hai phương pháp này sẽ xảy ra trong cùng một hội đồng - nhưng không phải của nó.

Tôi thực hiện Tuần tự hóa theo một cách ngẫu nhiên và thực hiện Deserialization trong một thao tác khác. Và đây cũng là sự kích thích nói quá: Unable to find assembly 'MyAssamblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

LƯU Ý 1: Tôi không có vấn đề gì với việc lấy lại trường, chỉ có các lớp mới tạo ra chúng.

CHÚ Ý 2: Tôi có cùng lớp này trong cả hai hội đồng.

+0

K ... Bối cảnh; chúng ta có nên giả sử bạn đang sử dụng BinaryFormatter không? Kiểu bạn đã tuần tự hóa: là trong một assembly mà cả hai dự án đều đang tham chiếu? Bạn có vô tình serialising nhiều dữ liệu hơn bạn mong đợi thông qua các sự kiện? (điều đó xảy ra thường xuyên) –

Trả lời

6

Chú thích 2: Tôi có lớp này giống nhau ở hai cụm

Không bạn không. Ít nhất, không liên quan đến thời gian chạy. Bạn có hai loại khác nhau có cùng tên. Một loại là được xác định bằng cách lắp ráp. Do đó "SomeType trong AssemblyA" hoàn toàn khác với "SomeType trong AssemblyB", ngay cả khi chúng xảy ra đã được biên dịch từ cùng một tệp nguồn.

BinaryFormatter hoạt động với thông tin loại, vì vậy điều này sẽ không hoạt động. Một lựa chọn sẽ là di chuyển kiểu vào một thư viện dll mà cả hai dự án khác tham chiếu - sau đó nó chỉ được định nghĩa một lần, và nó sẽ được hạnh phúc.

Tùy chọn khác là làm việc với bộ nối tiếp dựa trên hợp đồng (thay vì bộ nối tiếp dựa trên loại). Điều này có nghĩa là "các lớp trông tương tự" là tốt, ngay cả khi chúng ở trong các hội đồng khác nhau (và có lẽ có nguồn khác nhau, miễn là nó đủ "tương tự"). Ví dụ về serializers phù hợp cho điều này sẽ bao gồm (cộng với một vài người khác) XmlSerializer, DataContractSerializer (nhưng không NetDataContractSerializer), JavaScriptSerializer, hoặc protobuf-net nếu bạn muốn nhị phân thô dày đặc.

+0

Vâng, tôi sử dụng BinaryFormatter. Tôi muốn đi với lựa chọn thứ nhất của bạn. Vì vậy, tôi phải tạo một dự án mới, và thêm chúng vào cả hai projcts khác? Tôi có đúng không? –

+1

Trong giải pháp, thêm một dự án mới - chọn "thư viện". Bây giờ đặt lớp ở đó và từ xa nó từ hai nơi khác. Cuối cùng, đối với cả hai dự án gốc: tham chiếu, thêm tham chiếu ... chọn dự án thư viện mới mà bạn vừa tạo. –

+0

Đây là những gì tôi vừa làm! Thxa rất nhiều bạn đời. Sẽ cho bạn biết nếu nó sẽ làm việc (nhưng tôi biết nó sẽ :)). –

2

Tất cả các hội đồng có chứa các lớp trong phân cấp lớp của đối tượng bạn đang deserializing phải có mặt trong ứng dụng mà bạn đang thực hiện deserialization này. Chúng có thể được tham chiếu một cách rõ ràng (nếu bạn cần sự an toàn biên dịch thời gian với các lớp đó) hoặc chỉ được đặt trong thư mục bin của ứng dụng để chúng có thể được giải quyết khi chạy. Nếu chúng không được tham chiếu một cách rõ ràng, bạn sẽ phải sử dụng sự phản chiếu để đọc các giá trị từ cá thể deserialized.

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