反序列化异常:无法找到程序集

时间:2012-10-26 16:38:19

标签: c# sockets serialization deserialization

我正在序列化一些数据,比如字段和自定义类,以创建二进制数据(字节数组)。

然后我希望Deserialize从二进制数据返回到字段和类。

但我得到一个例外。如果这两种方法在同一个程序集中发生,那么一切正常 - 但事实并非如此。

我在一个assambly中进行序列化,然后在另一个中进行反序列化。这也是令人兴奋的说法: Unable to find assembly 'MyAssamblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

注意1:我没有遇到重新获得字段的问题,只有类导致它们。

注2:我在两个程序集中都有相同的类。

2 个答案:

答案 0 :(得分:9)

  

注2:我在两个程序集中都有相同的类

不,不。至少,不是运行时所涉及的。您有两种不同的类型碰巧具有相同的名称。类型由其程序集定义。因此,“AssemblyA中的SomeType与AssemblyB中的”SomeType完全不同“,即使它们碰巧是从同一源文件编译的。

BinaryFormatter使用类型信息,因此这不起作用。一种选择是将类型移动到其他项目引用的库dll - 然后它只定义一次,它会很高兴。

另一个选择是使用基于合同的序列化程序(而不是基于类型的序列化程序)。这意味着“看起来足够相似的类”很好,即使它们位于不同的程序集中(并且可能具有不同的源,只要它“足够相似”)。适用于此的序列化程序的示例包括(加上其他一些)XmlSerializer,DataContractSerializer(但不是NetDataContractSerializer),JavaScriptSerializer或protobuf-net,如果你想要密集的原始二进制文件。

答案 1 :(得分:2)

在要反序列化的对象的类层次结构中包含类的所有程序集必须存在于执行此反序列化的应用程序中。它们可以显式引用(如果您需要使用这些类的编译时安全性),也可以只放在应用程序的bin文件夹中,以便在运行时解析它们。如果未明确引用它们,则必须使用反射才能从反序列化实例中读取值。