2012-10-26 181 views
5

我正在序列化一些数据,如字段和自定义类来创建二进制数据(字节数组)。反序列化异常:无法找到程序集

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

但我得到一个异常。如果这两种方法会在同一个程序集中发生,那么它们都可以正常工作 - 但不是。

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

注1:我没有问题领域退回,只有类导致他们。

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

+0

K ...上下文;我们应该假设你正在使用BinaryFormatter?您序列化的类型是在两个项目都引用的程序集中?您是否意外地通过事件连续发布比您预期更多的数据? (这经常发生) –

回答

6

注2:我有两个组件

不,你不会这个相同的类。至少,与运行时间无关。你有两种不同的类型碰巧有相同的名字。一种类型是通过其组装定义为。因此,“AssemblyA中的”SomeType“与”AssemblyB中的SomeType“完全不同,即使它们碰巧是从相同的源文件编译的。

BinaryFormatter适用于类型信息,所以这不起作用。一种选择是将类型移动到其他项目都引用的库dll中,然后只定义一次,并且它会很开心。

另一种选择是使用基于合同的序列化程序(而不是基于类型的序列化程序)。这意味着即使它们在不同的程序集中(也许有不同的来源,只要它“足够类似”),那么“看起来类似的类”是很好的。如果你想要密集的原始二进制文件,适合的串行器的例子包括(另外还有一些)XmlSerializer,DataContractSerializer(但不是NetDataContractSerializer),JavaScriptSerializer或protobuf-net。

+0

是的,我使用BinaryFormatter。我想和你的第一个选项一起去。那么,我必须创建一个新项目,并将它们添加到其他两个项目中?我对吗? –

+1

在解决方案中,添加一个新项目 - 选择“库”。现在把课程放在那里,远离另外两个地方。最后,对于原始项目:引用,添加引用...选择刚刚创建的新库项目。 –

+0

这就是我刚做的! Thxa很多伴侣。会让你知道它是否会起作用(但我知道它会:))。 –

2

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