2015-11-15 47 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需要维护)。