我在2个不同的项目中有2个使用序列化的程序。 程序1序列化和反序列化一个名为Quiz的类的数组.Both项目具有Quiz类。 程序2仅反序列化程序1序列化的内容:
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。 这样说(消息erro是葡萄牙语,所以我把它翻译成英文): 无法找到程序集'infoAplicadaEnsino,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。 如何在Program2中反序列化?
答案 0 :(得分:5)
相同的类成员,名称和命名空间不足以使反序列化工作,程序集也必须匹配,这就是BinaryFormatter
的设计方式。您可以通过将Quiz
类提取到单独的类库项目并通过两个程序项目引用新项目来解决此问题。
答案 1 :(得分:3)
在两个解决方案(或项目)中,您可能有2个Quiz
类副本。而是使用类库项目创建第三个解决方案(或项目)。类库项目创建DLL而不是EXE。将您的2个解决方案(或项目)中共同使用的所有内容移动到第三个解决方案(或项目),然后在现有项目中引用第三个项目。因此,您只有一个Quiz
类(也只有一个loadSerialize
方法)。
这不仅可以使您的序列化/反序列化工作,而且可以更容易地保持一致(只需要维护Quiz
的一个版本)。