使用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, 0, (int)stream.Length);

            return byteRij;
        }
    }

    public static Datagram ToDatagram(byte[] rij) {
        using (MemoryStream stream = new MemoryStream()) {
            stream.Write(rij, 0, 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
看起来不错;)。 我希望你明白这一点。     

要回复问题请先登录注册