1

我正在研究 C# TCP Server-Client 编程。我的问题很简单,但不知何故我想不通。

我有一个对象我想序列化这个对象通过套接字发送并反序列化客户端。但问题在于反序列化。我用二进制格式化程序序列化对象。实际上我得到了我应该得到的实际字节数组。但不知何故,在反序列化时我得到了

System.Runtime.Serialization.SerializationException:“多服务器,版本=1.0.0.0,文化=中性,PublicTokenKey=Null”程序集找不到。

当我在序列化后尝试在服务器端反序列化时,它没有问题。

我尝试定制也不起作用的活页夹。如果有人可以帮助我,我真的很感激。

4

2 回答 2

1

如果我猜对了,你有 2 个项目——“多客户端”和“多服务器”。您序列化在“多服务器”中定义的对象,然后在“多客户端”中拥有该类的副本。

所以你序列化一个对象“MultiServer.SomeClass”,然后你想让它成为一个“MultiClient.SomeClass”。这行不通

您需要创建一个通用dll 项目(我们将其命名为“MultiCommon”,您将在其中放置您的类,并通过“MultiServer”和“MultiClient”引用它。这样,您将序列化和反序列化而不是“MultiServer.SomeClass” ” 但“MultiCommon.SomeClass”。

于 2018-04-04T08:18:22.647 回答
0

听起来您正在使用BinaryFormatter,坦率地说,在这种情况下,我认为最有价值的建议是:不要那样做。的数据格式从BinaryFormatter根本上与您的确切实现细节相关联,因此很难:a:在不同的端有不同的代码(意思是:部署非常困难和脆弱 - 到处都需要同时更改,或者 b:修改随着时间的推移实施。

坦率地说,我强烈建议寻找替代的序列化工具。我有很大的偏见,但 protobuf-net非常适合这种情况;它仍然是“二进制”(意思是:不是文本),但它与内部实现细节无关。它快速(通常比 快得多BinaryFormatter)、高效(通常需要的带宽比 少得多BinaryFormatter)、免费并且通常很容易应用于现有的对象模型;它通常意味着从此开始:

[Serializable]
public class Custom {
    public int Id {get;set;}
    public string Name {get;set;}
    // ...etc
}

对此:

[ProtoContract] // you can keep the [Serializable] for compat if you want
public class Custom {
    [ProtoMember(1)]
    public int Id {get;set;}
    [ProtoMember(2)]
    public string Name {get;set;}
    // ...etc
}
于 2018-04-04T08:54:58.040 回答