11

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

然后我想将Deserialize它从二进制数据返回到字段和类。

但我有一个例外。如果这两种方法发生在同一个程序集中,一切都会正常工作——但事实并非如此。

我在一个组件中进行序列化,并在另一个组件中进行反序列化。这也是excaption说的: Unable to find assembly 'MyAssamblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

注意 1:我对取回字段没有任何问题,只有类会导致它们。

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

4

2 回答 2

13

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

不,你没有。至少,就运行时而言,不是这样。您有两种碰巧具有相同名称的不同类型。类型由其程序集定义。因此,“ SomeTypein AssemblyA”与“in AssemblyB”完全不同SomeType,即使它们碰巧是从同一个源文件编译的。

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

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

于 2012-10-26T16:47:25.223 回答
2

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

于 2012-10-26T16:41:45.390 回答