C# 客户端-服务器 对象转换错误列表
本文关键字:转换 错误 列表 对象 服务器 客户端 | 更新日期: 2023-09-27 17:56:56
我正在用 C# 开发一个客户端服务器应用程序。
我正在从我的服务器向客户端发送Students
对象的List
,我在服务器端序列化这些对象并在客户端反序列化。序列化和反序列化如下:
// server side serialization.
List<Student> ordByMedGen = repo.ordByMedGen();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(writer.BaseStream, ordByMedGen);
// client side deserialization.
BinaryFormatter bin = new BinaryFormatter();
List<Student> list = (List<Student>)bin.Deserialize(receive.BaseStream);
Console.WriteLine(list.Count);
// print the list
使用这种方法,我成功地从服务器端发送了一List
字符串,并在客户端打印。当我尝试使用Student
类时,出现以下错误
[A]System.Collections.Generic.List
1[ServerClient.Student] cannot be cast to [B]System.Collections.Generic.List
1[ServerClient.Student]. 类型 A 源自 'mscorlib, 版本=4.0.0.0, 文化=中性, PublicKeyToken=b77a5c561934e089' 在上下文 'LoadNboth' at 位置 'C:''Windows''Microsoft.Net''assembly''GAC_64''mscorlib''v4.0_4.0.0.0__b77a5c561934e089''mscorlib.dll'. B 型源自 'mscorlib, 版本=4.0.0.0, 文化=中性, PublicKeyToken=b77a5c561934e089' 在上下文 'LoadNboth' at 位置 'C:''Windows''Microsoft.Net''assembly''GAC_64''mscorlib''v4.0_4.0.0.0__b77a5c561934e089''mscorlib.dll'.
为了创建服务器.exe和客户端.exe我使用了以下命令:
C:'Windows'Microsoft.NET'Framework'v4.0.30319'csc.exe Server.cs Repository.cs Student.cs
C:'Windows'Microsoft.NET'Framework'v4.0.30319'csc.exe Client.cs Student.cs
而且我没有收到任何错误或警告。我的Student
类也有[Serialization]
属性。我确实在网上搜索了这种错误,但我找不到任何有用的东西。
后来的编辑:也许在编译时,在服务器和客户端上都提供 Student.cs 作为参考的事实以某种方式混淆了编译器,并将学生视为 2 种不同的类型:A 和 B ?
后期编辑(2):这个问题也可以通过在编译时创建一个 dll 来解决学生.cs并在服务器和客户端上引用,因此编译器不会混淆。
听起来您有两个不同的程序集 - 一个在客户端,一个在服务器上 - 贡献此类型。类型由其程序集定义,即使相同:也不能互换。基本上,BinaryFormatter将在这里的每一步都与您作战。我的建议:不要使用二进制格式化程序。大多数其他序列化程序(XmlSerializer,json.jet,jil,DataContractSerializer,protobuf-net等)在您的场景中都可以正常工作,并且根本不会抱怨。