2010-11-16 25 views
18

Tôi đang sử dụng BinaryFormatter để tuần tự hóa một mảng các cá thể lớp thành một tệp. Tôi có thể deserialize tiền phạt này trong cùng một ứng dụng. Khi tôi thử deserialization cùng trong một ứng dụng khác nhau (mà kéo trong một tập tin phổ biến mà không làm việc) sau đó tôi nhận được lỗi sau:Cách lấy BinaryFormatter để deserialize trong một ứng dụng khác

{"Could not load file or assembly 'pmlscan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The module was expected to contain an assembly manifest."} 

nơi pmlscan là tên của các ứng dụng ban đầu. Làm cách nào để nhận BinaryFormatter không thử tải pmlscan?

Trả lời

0

Bạn không thể!

Tùy chọn tốt nhất là xuất bản các lớp serializable của bạn trong một hội đồng riêng biệt và bạn tham khảo nó trong máy chủ (serializer) và máy khách (deserializer). Bằng cách này bạn không xuất bản toàn bộ mã nguồn của bạn với thế giới bên ngoài.

+3

Bạn đang nói về .Net tại đây. Mọi thứ đều có thể. (Mặc dù lắp ráp riêng biệt là dễ nhất). – GvS

+0

Sự cố không cố gắng tải và không thành công. Câu hỏi là "không thử và tải pmlscan". – Aliostad

+0

Sử dụng assemblyRedirect bạn không thử tải pmlscan. Nhưng nói "Bạn không thể!", Điều đó không đúng. Vì đây là một vấn đề phức tạp, tôi tha thứ cho bạn và không downvote bạn cho nó ;-) – GvS

3

Trình nối tiếp nhị phân mã hóa thông tin lớp và lắp ráp thành một mảng nhị phân. Khi bạn deserialize mảng này, các deserializer sử dụng thông tin này để xác định vị trí lắp ráp các lớp học cư trú trong, và (nếu cần thiết) tải lắp ráp vào bạn miền ứng dụng. Nếu ứng dụng kia không có quyền truy cập vào assembly thì kiểu lớp nằm trong đó bạn sẽ thấy lỗi mà bạn đang gặp phải.

Như đã đề cập trong một áp phích khác, hãy đặt các lớp phổ biến này vào một hội đồng được chia sẻ và triển khai chúng cho ứng dụng khách/ứng dụng khác cũng như ứng dụng máy chủ.

+0

+1 của tôi, thưa bạn ... – Aliostad

+2

Vâng, bạn luôn có thể giải quyết với một hội đồng khác và loại tương thích cho quá trình deserialization. Điều đó có hiệu quả, nhưng không phải cho người yếu tim. – leppie

2

Nếu các lớp giống nhau, và nó chỉ là một hội đồng khác, bạn có thể thử thêm một phần assemblyBinding cho bạn .config tệp.

Bạn cũng nên đọc bài viết về Resolving Assembly LoadsTypeResolve event.

Sử dụng các kỹ thuật này, bạn có thể chuyển hướng hệ thống loại .Net sang loại khác trong khi deserializing.

Lưu ý: Di chuyển các lớp được chia sẻ của bạn sang một tệp .dll được chia sẻ sẽ là giải pháp dễ dàng hơn.

1
sealed class PreMergeToMergedDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return Type.GetType("BinarySerialization.YourClass"); 
    } 
} 
BinaryFormatter bfDeserialize = new BinaryFormatter(); 
bfDeserialize.Binder = new PreMergeToMergedDeserializationBinder(); 
while (fsRead.Position < fsRead.Length) 
{ 
    YourClass sibla = (YourClass)bfDeserialize.Deserialize(fsRead); 
} 

Giả sử bạn có một exe rằng serializes dữ liệu trong bạn "YourClass" và một exe khác mà de-serializes các đối tượng YourClass.

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