2015-11-15 62 views
2

我有2個程序使用序列化,在2個不同的項目中。 程序1序列化和反序列化一個名爲Quiz.Class的類的數組。該項目包含Quiz類。 計劃2只反序列化有什麼計劃1連載:不同程序的序列化c#

private void loadSerialize(object sender, EventArgs e) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     Stream stream = new System.IO.FileStream("DataFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read); 
     Quiz[] obj = (Quiz[]) formatter.Deserialize(stream); 
     for(int i = 0; i< obj.Length; i++) 
     { 
      quizes.Add(obj[i]); 
     } 
     stream.Close(); 
    } 

    private void saveSerialize(object sender, FormClosedEventArgs e) { 

     Quiz[] obj = quizes.ToArray(); 
     BinaryFormatter formatter = new BinaryFormatter(); 
     Stream stream = new FileStream("DataFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
     formatter.Serialize(stream, obj); 
     stream.Close(); 
    } 

兩個節目有「loadSerialize」功能,而只有PROGRAM1有「saveSerialize」功能。 當我嘗試反序列化Program2中的文件時,我發生serializationException。 說(消息錯誤是葡萄牙語,所以我把它翻譯成英文): 找不到程序集'infoAplicadaEnsino,版本= 1.0.0.0,文化=中立,PublicKeyToken = null'。 如何在Program2中反序列化?

回答

5

同一類的成員,名稱和命名空間是不夠的,反序列化的工作,大會還必須匹配,這是多麼BinaryFormatter設計。您可以通過將Quiz類提取到單獨的類庫項目並通過兩個程序項目引用新項目來解決此問題。

+1

確實。還有一個懶惰選項 - 只需將第一個exe添加爲第二個項目的引用即可。 –

+0

現在我正在獲取錯誤信息,因爲當我試圖序列化對象時,它正被另一個進程使用,因此無法訪問該文件。 編輯:NVM,刪除以前的序列化文件時解決。 – kadzu

3

您可能在兩個解決方案(或項目)中擁有2個Quiz類的副本。相反,用類庫項目創建第三個解決方案(或項目)。類庫項目創建DLL而不是EXE。將所有在你的2個解決方案(或項目)中共同使用的東西移到第三個,然後在現有的項目中引用這個第三個項目。所以你將只有一個Quiz類(也只有一個loadSerialize方法)。

這不僅會使您的序列化/反序列化工作,而且會使事情保持一致變得更加容易(只有一個版本的Quiz需要維護)。