如何解决使用UdpClient C#发送对象
| 我目前正在Visual Studio 2010中进行测试。我制作了一个客户端和服务器,它们都将通过UdpClient连接。 我想将一个对象从客户端发送到服务器。我有两种方法可以将对象转换为字节并将其转换为对象。现在,当我测试我的应用程序时,一旦在服务器上收到,我就无法将其转换回一个对象 我的服务器看到接收到该对象,并尝试将其从字节转换为对象,但这给出了错误。System.Runtime.Serialization.SerializationException was unhandled Message=Unable to find assembly
这似乎可以,因为两个应用程序都位于不同的命名空间中。
这些是我的转换方法;客户端和服务器上都相同
public byte[] ToBytes() {
using (MemoryStream stream = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream,this);
stream.Position = 0;
byte[] byteRij = new byte[1024];
stream.Read(byteRij,(int)stream.Length);
return byteRij;
}
}
public static Datagram ToDatagram(byte[] rij) {
using (MemoryStream stream = new MemoryStream()) {
stream.Write(rij,rij.Length);
stream.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
return (Datagram)formatter.Deserialize(stream);
}
}
我该如何解决?
提前致谢
解决方法
您需要将所有序列化的类放在类库项目中。在服务器和客户端中都使用该库。
另请注意,UDP不可靠。不能保证您的消息完全到达。
, BinaryFormatter与类型元数据紧密相关。这不是一个好选择,因为您有不同的类型。实际上,无论如何,IMO都不是一个不错的选择:)它不是非常耐版本的,并且不是可移植的。
我将在这里公开推荐protobuf-net(公开:我写了它)。它是免费的OSS,但使用Google的protobuf格式来解决所有高炉问题。与BinaryFormatter相比,它的设置和使用非常简单,速度更快,并且输出较小。由于它是基于合同的,因此您在两端可以具有不同的类型,如它们在合同上所约定的那样记录(匹配字段号等)。
例如:
[ProtoContract]
public class Foo {
[ProtoMember(1)]
public string X {get;set;}
[ProtoMember(2)]
public int Y {get;set;}
}
然后只需使用ProtoBuf.Serializer.Serialize(stream,object)写入数据。
如果需要,您也可以不使用属性而工作,这需要更多的设置,但不需要太多。
, 您可能会遇到不满意的依赖性问题。这可能是由于不同的名称空间或尝试序列化服务器上未安装的外部组件引起的。
说:您发送的对象类型为“ 3”。
服务器中还定义了类MyFoo
,但定义为MyApp2.MyFoo
(这很愚蠢,这意味着您必须修复设计)。 Server不知道如何创建MyApp1.MyFoo
对象,因为它不够聪明,无法发现他也定义了此类,但命名为MyApp2.MyFoo
。
您应该使用相同的名称空间。这就是他们的目的。而且,它们使处理依赖关系更加容易。和MyApp.Server
交谈MyApp.Client
看起来不错;)。
我希望你明白这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。