2009-06-08 42 views
2

情况:反序列化似乎不适用于IDE中的强命名对象

我有一堆坐在Web服务后面的业务对象。所有对象都封装在一个BusObjects.DLL中,该对象是强命名的,并位于服务器上的GAC中(因为服务器上的其他应用程序也可以访问它)。

我有一个点击一次的客户端应用程序,它调用了上述的Web服务。该一次性应用程序也附带此BusObjects.DLL。

Web服务将数据返回给客户端的方式如下所示:它将业务对象序列化为一个字节数组并将此字节数组返回给客户端。客户端将接收到的字节数组反序列化为业务对象。这是可能的,因为客户端和服务器代码都有对同一个BusObjects.DLL的引用。这一切都很好。

对我来说问题是这样的。当我有客户端的解决方案(其包括BusObjects项目)在VS2005 IDE,代码无法字节数组反序列化回业务对象,因为它声称,

“无法加载文件或组件 “CC.BusObjects, 版本= 2.12.1.47文化=中性, 公钥= af56fdb58c626305”或 一个及其依赖的位于 集的清单定义并 不匹配组件参考 (从HRESULT异常:。0x80131040 )“

我试过匹配的版本,但是如果BusObjects项目被引用为项目而不是外部程序集,似乎什么都不起作用。不幸的是,我必须在解决方案内部有BusObjects进行调试。

我该怎么办才能解决这个问题?我听说过版本重定向,但似乎无法使它与强大的命名组合工作,但也许我做错了。

这里是序列化和反序列化代码:

public static byte[] ToBinary(Object objToBinary) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     BinaryFormatter formatter = new BinaryFormatter(null, 
        new StreamingContext(StreamingContextStates.Clone)); 
     formatter.Serialize(memStream, objToBinary); 
     memStream.Seek(0, SeekOrigin.Begin); 
     return memStream.ToArray(); 
    } 


    public static object BinaryTo(byte[] objFromBinary) 
    { 
     MemoryStream ms = new MemoryStream(objFromBinary); 
     BinaryFormatter formatter = new BinaryFormatter(); 
     ms.Position = 0; 
     object obj = formatter.Deserialize(ms); 
     return obj; 
    } 

要序列:

[WebMethod] 
public byte [] GetContacts() 
{ 
    return ToBinary(BusObjects.GetContacts()); 
} 

反序列化:

byte [] bts = ContactService.GetContacts(); 
List<Contact> lstContacts = (List<Contact>) BinaryTo(bts); 
+0

你在客户端签署组装呢?那是在你的客户端项目中,如果你去属性 - >签名,你有没有相同的密钥,服务器端用来签署你的程序集? – 2009-06-08 22:26:56

+0

嗯,这是同一个项目,所以是的,它以同样的方式签名。 – AngryHacker 2009-06-08 22:44:00

+0

JP,你最初的预感是正确的。我去问那些做我们所有建造的人......事实证明,他们没有使用我提供的密钥,而是他们自己的密钥,出于安全原因。 – AngryHacker 2009-06-08 23:12:00

回答

2

什么是几乎可以肯定发生的是你拥有的版本号集在构建过程中自动递增。这通常会导致一个关闭的版本号场景,可能会导致您所看到的加载问题。

请尝试以下

  • 转到解决方案资源管理。
  • 展开属性节点
  • 开放的AssemblyInfo.cs
  • 更改的AssemblyVersion属性有一个硬编码的版本号