2009-02-03 24 views
24

Tôi có một dự án sử dụng BinaryFormatter để tuần tự hóa một tập hợp các cấu trúc với chuỗi và bool? loai du lieu.Nhạy cảm với quá trình Deserialization với phiên bản lắp ráp khác nhau

Việc tuần tự hóa/deserialization hoạt động tốt, tuy nhiên nếu tôi thay đổi assembly không thực hiện công việc do tiêu đề trong tệp nhị phân cho biết yêu cầu Assembly x thay vì Assembly y để xử lý dữ liệu.

Có thể thiết lập tuần tự hóa/deserialization để được lắp ráp thuyết bất khả tri?

+0

Tôi gặp sự cố tương tự ... vui mừng khi biết địa chỉ đã được giải quyết. – mmr

Trả lời

19

Bạn có thể kiểm soát cách trình định dạng nhị phân xử lý các loại của nó bằng cách gán một SerializationBinder tùy chỉnh cho trình định dạng. Bằng cách này, bạn sẽ không cần phải gây rối với các sự kiện giải quyết của AppDomain và bạn loại bỏ nguy cơ tác dụng phụ không mong muốn từ đó.

Có ví dụ chi tiết tại MSDN.

+0

Cảm ơn, điều này có vẻ như là lựa chọn an toàn nhất - đặc biệt là nếu tôi di chuyển mã vào một hội đồng khác ... –

+0

ngoại trừ việc nó không hoạt động (ít nhất là đối với tôi ...) – mmr

+0

@mmr: Tôi vừa thử nghiệm và nhận nó đang làm việc. Bắt đầu với ví dụ MSDN trong câu trả lời, và sửa đổi các binder serialization để cho phép một số phiên bản lắp ráp không phù hợp. – SteinNorheim

5

Hook vào sự kiện AppDomain.OnAssemblyResolve và sửa chữa-up tên lắp ráp

private System.Reflection.Assembly OnAssemblyResolve(System.Object sender, System.ResolveEventArgs reArgs) 
{ 
    foreach(System.Reflection.Assembly assembly in System.AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     System.Reflection.AssemblyName assemblyName = assembly.GetName(); 
     if(assemblyName.FullName == reArgs.Name) 
     { 
       return(assembly); 
     } 
    } 
} 

nguồn: http://osdir.com/ml/windows.devel.dotnet.clr/2003-12/msg00441.html

+0

Tôi ban đầu sẽ sử dụng điều này, tuy nhiên tôi có thể thấy rằng có thể có trường hợp góc không thành công với việc thực thi đồng thời .. –

1

GAC là tài nguyên đầu tiên của bạn, cho phép các phiên bản khác nhau của hội đồng để cùng tồn tại bên -bên cạnh. Nhưng điều đó không thực sự giải quyết bất cứ điều gì trừ khi ứng dụng của bạn là phiên bản khoan dung quá. Serialization nhị phân có một số tính năng để xử lý serialization khoan dung phiên bản. Đọc về nó trong MSDN library article này.

+0

Cảm ơn đề xuất GAC, tuy nhiên tôi đang cố gắng không để lại dấu chân nặng nề với Ứng dụng, có mọi thứ chạy từ thư mục riêng của nó. –

3

Có các công cụ tuần tự hóa (nhị phân) tăng cường (like this) không phụ thuộc vào lắp ráp.

+0

Xin chào, cảm ơn tất cả công việc khó khăn về vấn đề này. – InteXX

11

Bạn có thể thay đổi thuộc tính BinaryFormatter AssemblyFormat của bạn để thực hiện tuần tự hóa độc lập với phiên bản lắp ráp.

// Example 
var binFormat = new BinaryFormatter(); 
binFormat.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple; 
+0

Nó hoạt động nhưng dữ liệu phải được tuần tự hóa và deserialized bằng cách sử dụng cùng một phương pháp. – dariol

+0

+1 công trình này và là giải pháp đơn giản nhất mà tôi có thể thấy – earcam

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