2013-07-12 106 views
1

我有3个项目,首先是客户端,第二个是在服务器和最后一个是BroadcastMessage:二进制序列化/反序列化

在客户机有这样的代码序列化和对象(在此= BroadcastMessage ):

public MemoryStream SerializeObject() 
{ 
    MemoryStream stream = new MemoryStream(); 

    BinaryFormatter formatter = new BinaryFormatter(); 

    formatter.Serialize(stream, this); 

    return stream; 
} 

然后,我转换这个流成字节[]和发送通过套接字服务器,在那里,我反序列化与此:

BinaryFormatter formatter = new BinaryFormatter(); 
Stream str = new MemoryStream(inMessage); 
BroadcastMessage m = (BroadcastMessage) formatter.Deserialize(str); 

的客户端和服务器之间的通信是正确的,我收到完整的流,但是当我尝试反序列化时,根本没有工作,给我一个TargetInvocationException,原因是试图找到对象(BroadcastMessage)序列化的项目。如果我将这个项目添加到服务器,反序列化没有问题,但我无法添加使用此“BroadcastMessage”的每个类的项目。

有什么建议吗?序列化时,有没有办法指出正确的名称空间?提前致谢!

编辑: 好的,这个问题是由于我在课堂中订阅了一个事件,并且完全正常工作,感谢所有的时间。

回答

1

您不应该引用整个项目。具有特定类型的组件就足够了。因此,您应该将所有需要(de)序列化的类型放入它们自己的程序集中,并从两个项目中引用它。

无论如何,您需要定义这些类型,这样您将摆脱在项目中放置相同的代码两次(DRY原则)。

+0

@JeffRSon嗨 我想我不明白你在所有的, 在一方面我必须在服务器上,另一方面我有客户, 要做到它们之间的通信,我用一个又一个, 广播消息。 服务器引用BroadcastMessage和客户端。 客户端引用到BroadcastMessage。 – Nekeniehl

+0

Cont .. 这种情况是:客户端由X个项目实现,例如,项目A实现了客户端,然后当我从项目A向服务器发送BroadcastMessage时,服务器说他找不到项目A,如果我在项目A的服务器中添加引用(dll或整个项目,无所谓),那么它就可以工作。 但广播的东西将实施至少10个项目,并将所有的引用添加到服务器...我不知道,必须是其他方式 – Nekeniehl

+0

问题是,如果你复制'BroadcastMessage'的来源,它是所有不同的序列化程序的类型 - 您需要确保它始终是相同的类型。因此,您应该在一个项目(一个程序集)中定义所有共享类型(如'BroadcastMessage'),这些项目可以从客户端和服务器引用。例如,您没有在10个项目中定义'BroadcastMessage',但只有一个(在任何地方都使用)。 – JeffRSon

相关问题