等于没回答,你不如说,我已经在qq里回答了你,反正都看不到,如此保密做啥?这里问题很简单,如果你的StudentList同时在2个项目中定义了,那么序列化和反序列化将回出现你这样的问题,因为即使类名一样,但是类的命名空间却不同。解决方法有两个: 一、即便2个项目,你也都用同一个命名空间这是完全允许的。 二、使用DataContractSerializer类来序列化和反序列化,对要序列化的类定义时添加 [DataContract(Namespace = "")]属性,指定一个相同的命名空间,例如:[DataContract(Namespace = "默认命名空间")] public class StudentList { [DataMember] public int A { get; set; } [DataMember] public String B { get; set; } }
用SerializationBinder 如 A.A aa = new A.A(); BinaryFormatter bf = new BinaryFormatter(); MemoryStream ms = new MemoryStream(); bf.Serialize(ms, aa);ms.Seek(0, SeekOrigin.Begin); bf.Binder = new MyBinder(); B.A ba = (B.A)bf.Deserialize(ms);
class MyBinder : SerializationBinder { public override Type BindToType(string assemblyName, string typeName) { return typeof(B.A); } } http://msdn.microsoft.com/zh-cn/library/ffas09b2(v=vs.90).aspx
因为序列化和反序列化需要使用同一个程序集的同一个可序列化类定义,因此,要么使用同一个程序集定义类并进行序列化和反序列化,要么必须引用定义可序列化类的程序集
写student.dat文件的项目地址下载地址http://d.1tpan.com/tp1502912424
还有一个是读取编译文件的项目的地址:http://d.1tpan.com/tp0508508001
一、即便2个项目,你也都用同一个命名空间这是完全允许的。
二、使用DataContractSerializer类来序列化和反序列化,对要序列化的类定义时添加 [DataContract(Namespace = "")]属性,指定一个相同的命名空间,例如:[DataContract(Namespace = "默认命名空间")]
public class StudentList
{
[DataMember]
public int A { get; set; }
[DataMember]
public String B { get; set; }
}
student.dat是在程序集8-4里被序列化的,现在要在8-4实例里进行反序列化,因此报错
应为定义的序列化类(这里是class stuent和class stuentlist)只需定义一次,以后使用必须是的是这个命名空间下的定义,再次定义在其他命名空间下也不行(即使是class stuent和class stuentlist的定义保持一模一样也不行),需要使用同一个程序集的同一个可序列化类定义,因此,要么使用同一个程序集定义类并进行序列化和反序列化,要么必须引用定义可序列化类的程序集
辛苦大家。
如
A.A aa = new A.A();
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, aa);ms.Seek(0, SeekOrigin.Begin);
bf.Binder = new MyBinder();
B.A ba = (B.A)bf.Deserialize(ms);
class MyBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
return typeof(B.A);
}
}
http://msdn.microsoft.com/zh-cn/library/ffas09b2(v=vs.90).aspx