代码之家  ›  专栏  ›  技术社区  ›  Emirhan Özsoy

C#序列化-找不到程序集

  •  1
  • Emirhan Özsoy  · 技术社区  · 6 年前

    我正在进行C#TCP服务器客户端编程。我的问题很简单,但不知怎的,我弄不明白。

    我有一个对象,我想序列化这个对象通过套接字发送并反序列化客户端。但问题是反序列化。我用binaryformatter序列化对象。实际上,我得到了应该得到的实际字节数组。但在反序列化的过程中

    系统运行时。序列化。SerializationException:“多服务器, 版本=1.0.0.0,区域性=自然,PublicTokenKey=Null”程序集可能 找不到。

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

    我试着定制活页夹,但也没用。如果有人能帮助我,我真的很感激。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Miq    6 年前

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

    因此,您序列化了一个对象“MultiServer.SomeClass”,然后希望将其设置为“MultiClient.SomeClass”。这行不通。

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

        2
  •  0
  •   Marc Gravell    6 年前

    听起来你在用 BinaryFormatter ,坦率地说,在这种情况下,我认为最有价值的建议是: 不要那样做 。的数据格式 二进制格式 从根本上讲,它与您的具体实现细节有关,因此很难做到:在不同的一端有不同的代码(意思是:部署非常困难和脆弱-任何地方都需要更改 同时 ),或b:随着时间的推移修改实现。

    坦率地说,我强烈建议您考虑其他序列化工具。我有很大的偏见,但protobuf网络是有效的 非常 对于这种类型的场景;它仍然是“二进制的”(意思是:不是文本),但它与内部实现细节无关。速度很快(通常比 二进制格式 ),高效(通常所需带宽比 二进制格式 ),免费,通常很容易应用于现有对象模型;这通常意味着从这一点出发:

    [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
    }