反序列化是产生问题无法找到程序集“8-4, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”。

teahj 2012-05-21 11:23:32
运行时产生问题
StudentList students = (StudentList)bf.Deserialize(stream); //把流反序列化
无法找到程序集“8-4, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”。
恳求大家告诉我是什么原因,究竟我的知识体系存在哪些漏洞误区,导致我编写的代码不完整而产生问题,还是我对vs机制理解不透彻?
附上项目(里面也包含了一个需要反序列化的student.dat文件)的地址
http://dynamic.xlpan.com/file/192477228/e44cfc4b-f131-4294-af70-ce39fec68f78
或者是:http://d.1tpan.com/tp0508508001

希望大神们告诉我究竟什么问题,指点指点小菜
...全文
2524 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hustypf 2012-12-19
  • 打赏
  • 举报
回复
用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
teahj 2012-05-23
  • 打赏
  • 举报
回复
经过大家的帮助,我想了见天,
student.dat是在程序集8-4里被序列化的,现在要在8-4实例里进行反序列化,因此报错
应为定义的序列化类(这里是class stuent和class stuentlist)只需定义一次,以后使用必须是的是这个命名空间下的定义,再次定义在其他命名空间下也不行(即使是class stuent和class stuentlist的定义保持一模一样也不行),需要使用同一个程序集的同一个可序列化类定义,因此,要么使用同一个程序集定义类并进行序列化和反序列化,要么必须引用定义可序列化类的程序集
辛苦大家。
misery2011 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
等于没回答,你不如说,我已经在qq里回答了你,反正都看不到,如此保密做啥?
[/Quote]
鄙视一下。
WAN 2012-05-23
  • 打赏
  • 举报
回复
PublicKeyToken = null只是表明没有强名称签名,不是没有签名
qldsrx 2012-05-23
  • 打赏
  • 举报
回复
我是没下过楼主的代码,但是既然贴出来的错误信息是PublicKeyToken = null,那么就不存在签名,只要考虑命名空间即可。
WAN 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 7 楼 的回复:
等于没回答,你不如说,我已经在qq里回答了你,反正都看不到,如此保密做啥?
[/Quote]
我在2楼已作了简略的回答。后来楼主给我发了私信,我回了后在这里只是提了句,请qldsrx不要这样激动

估计qldsrx也没有下过楼主的代码看过。楼主是在两个程序集里把可序列化类定义了两次。命名空间固然要求一致。但首先是要保证程序集签名的一致!!
qldsrx 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
已在私信中回了你。
其实作为学习,最重要的是理解原理,而有时实在是搞不明白了,也不值得花过多的时间,慢慢积累的知识多了,就豁然开朗了
[/Quote]
等于没回答,你不如说,我已经在qq里回答了你,反正都看不到,如此保密做啥?

这里问题很简单,如果你的StudentList同时在2个项目中定义了,那么序列化和反序列化将回出现你这样的问题,因为即使类名一样,但是类的命名空间却不同。解决方法有两个:
一、即便2个项目,你也都用同一个命名空间这是完全允许的。
二、使用DataContractSerializer类来序列化和反序列化,对要序列化的类定义时添加 [DataContract(Namespace = "")]属性,指定一个相同的命名空间,例如:

[DataContract(Namespace = "默认命名空间")]
public class StudentList
{
[DataMember]
public int A { get; set; }
[DataMember]
public String B { get; set; }
}
anzhiqiang_touzi 2012-05-23
  • 打赏
  • 举报
回复
缺少dll引用
teahj 2012-05-23
  • 打赏
  • 举报
回复
大家能改改我的代码不?.....................
sgeoffrey 2012-05-22
  • 打赏
  • 举报
回复
是B/S 还是C/S啊? 如果用自己定义 的序列化和反序列化就可以,
WAN 2012-05-22
  • 打赏
  • 举报
回复
已在私信中回了你。
其实作为学习,最重要的是理解原理,而有时实在是搞不明白了,也不值得花过多的时间,慢慢积累的知识多了,就豁然开朗了
teahj 2012-05-22
  • 打赏
  • 举报
回复
那我就将项目涉及到的所有代码都发给了,大家帮帮我,教教我编写一个含有dll的项目
写student.dat文件的项目地址下载地址http://d.1tpan.com/tp1502912424
还有一个是读取编译文件的项目的地址:http://d.1tpan.com/tp0508508001
teahj 2012-05-22
  • 打赏
  • 举报
回复
我是个菜鸟,刚学C#,各位老师们你们能说具体点不。能帮我调试下代码吗?你们说的dll我倒是看过,但我从没用过,也不会编写啊?
ONE-PIECE 2012-05-22
  • 打赏
  • 举报
回复
YES
[Quote=引用 3 楼 的回复:]
缺少dll
[/Quote]
熙风 2012-05-22
  • 打赏
  • 举报
回复
缺少dll
WAN 2012-05-22
  • 打赏
  • 举报
回复
student.dat是在程序集8-4里被序列化的,现在要在8-4实例里进行反序列化,因此报错
因为序列化和反序列化需要使用同一个程序集的同一个可序列化类定义,因此,要么使用同一个程序集定义类并进行序列化和反序列化,要么必须引用定义可序列化类的程序集
机器人 2012-05-21
  • 打赏
  • 举报
回复
StudentList 里估计引用到别的程序集里的类了。而这个程序集在你的项目里没有引用到。

111,113

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧