我正在使用C#开发客户端服务器应用程序。
我从服务器向客户端发送List
Students
个// 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
个字符串并在客户端打印。当我尝试使用1[ServerClient.Student] cannot be
cast to [B]System.Collections.Generic.List
课时,我收到了以下错误
[A] {System.Collections.Generic.List {1}} 1 [ServerClient.Student]。 A类源自&#39; mscorlib,Version = 4.0.0.0,Culture = neutral, 公钥= b77a5c561934e089&#39;在上下文中'LoadNeither&#39;在 地点 &#39; C:\的Windows \ Microsoft.Net \组件\ GAC_64 \ mscorlib程序\ v4.0_4.0.0.0__b77a5c561934e089 \ mscorlib.dll中&#39 ;. 类型B源自&#39; mscorlib,版本= 4.0.0.0,文化=中性, 公钥= b77a5c561934e089&#39;在上下文中'LoadNeither&#39;在 地点 &#39; C:\的Windows \ Microsoft.Net \组件\ GAC_64 \ mscorlib程序\ v4.0_4.0.0.0__b77a5c561934e089 \ mscorlib.dll中&#39;
要创建Server.exe和Client.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作为参考提供在服务器和客户端上的事实以某种方式混淆了编译器并将Student视为2种不同的类型,如错误:A和B?
稍后编辑(2):这个问题也可以通过在编译时创建一个dll来解决 Student.cs并在服务器和客户端上引用,因此编译器不会感到困惑。
答案 0 :(得分:1)
听起来你有两个不同的程序集 - 一个在客户端,一个在服务器上 - 贡献这种类型。类型由它们的程序集定义,即使相同:也不可互换。基本上,BinaryFormatter会在这里为你的每一步而战。我的建议:不要使用BinaryFormatter。大多数其他序列化程序(XmlSerializer,json.jet,jil,DataContractSerializer,protobuf-net等)将在您的场景中完美运行,并且不会抱怨。