C 中泛型集合List反序列化問題及解決方法

2021-07-05 15:49:52 字數 1371 閱讀 2756

在一些應用系統中常常有兩個子系統軟體a與b:a軟體序列化乙個資料檔案,該檔案將在b軟體中使用。例如,在15年的交通運輸部小樣本調查資料的審核軟體中,a軟體就是筆者自己用的審核規則編制軟體;b軟體則是給使用者使用的審核小樣本調查資料的客戶端軟體,該軟體只需要使用a軟體發布的規則即可。筆者的處理方法是,a軟體序列化審核規則datatable到乙個檔案中,b軟體反序列化該檔案後直接使用。

using (filestream fs = new filestream("student.dat", filemode.open, fileaccess.read))

public class localizedtypegetter : system.runtime.serialization.serializationbinder

, ", typename, assemblyname)); // 從當前程式集中獲取型別名,注意,型別的命名空間要相同

}}

在反序列化時,給序列化類的binder方法乙個自定義的型別localizertypegetter,該型別重寫了bindtotype()方法,保證在當前程式集中獲取型別。

這裡需要強調的是,反序列化和序列化程式集應該是相同的命名空間(不同的命名空間是否可行?筆者尚未做相關測試,因為筆者的ab軟體的命名空間是相同的)。

前面介紹的方法不能解決泛型集合list的反序列化問題。因為list被.net框架認為是標準型別,將在mscorlib動態庫中查詢型別,而不是在使用者程式集中查詢型別,筆者通過除錯跟蹤bindtotype()方法發現了這個現象。在尚未找到通用方式前,筆者採取了如下「笨」的直接方法解決:

public class localizedtypegetterex : localizedtypegetter

return base.bindtotype(assemblyname, typename);

}}

派生localizedtypegetter型別,再次重寫bindtotype()方法。在再重寫方法中,判斷是否是反序列化需要的泛型集合,如果是則直接返回泛型結合的型別list(如**中的list)。此時,只需要在反序列化時修改**為 bf.binder = new localizedtypegetterex()即可。

上述**在win7、visual studio 2012、.net framework3.5環境下除錯通過。

補充:在設計15年小樣本調查資料處理軟體時,使用了datatable儲存審核規則,反序列化和序列化只需要考慮上面一般型別的反序列化方法即可。然而,最近在做公路養護報表審核軟體時,使用泛型list儲存審核規則記錄,在序列化和反序列化時就碰到了反序列化失敗的異常。暫時找到的方法是笨方法,希望以後改進為通用方法。

List列表序列化與反序列化

把自定義的cameras類新增到列表中 在窗體關閉時序列化列表到.dat檔案中 在窗體載入時把.dat檔案的資訊反序列化到列表裡 序列化反序列化 新建binaryserializer類 public void serialize t o,string filepath catch exception...

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...

C 序列化 反序列化

序列化又稱序列化,是.net執行時環境用來支援使用者定義型別的流化的機制。其目的是以某種儲存形成使自定義物件持久化,或者將這種物件從乙個地方傳輸到另乙個地方。net框架提供了兩種序列化的方式 1 是使用binaryformatter進行序列化 2 使用soapformatter進行序列化 3 使用x...