2010-03-05 32 views
1

我有两个不同的应用程序,我使用GroupLab网络在它们之间进行通信。这个想法是有一个共享字典,当这个共享字典中的某些内容发生变化时,另一个应用程序会收到通知。通知部分起作用。这是问题。我在第一个应用程序中有以下代码。C#读取应用程序之间的序列化对象

TouchInfo t = new TouchInfo(); 
int.TryParse(txtXCoord.Text, out t.X); 
int.TryParse(txtYCoord.Text, out t.Y); 
this.sharedDictionary1["/pointOne"] = t; 

其中TouchInfostruct。存储在共享字典中的这个对象可以被两个应用程序访问。代码如下所示:

TouchInfo val = (TouchInfo)this.sharedDictionary1["/pointOne"] 

尽管此代码在创建对象的应用程序中工作。我得到的第二以下错误:

{Unserializable object: problem: System.Runtime.Serialization.SerializationException: Unable to find assembly 'NetworkingTestProgramOne, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

我意识到这个问题是因为系列化还存储连载它的程序的程序集信息。但我确实需要它通过不同的程序进行交流。我如何完成这项工作?

回答

1

你有TouchInfo在两个不同的程序集中声明吗?这是一个坏主意 - 你应该有一个包含两个应用程序所需类型的通用程序集。

就我个人而言,我会尽量避免默认的.NET二进制序列化,宁愿更可控的东西 - 我偏向于谷歌协议缓冲区出于各种原因。 GroupLab Networking 是否需要“正常”二进制序列化?

另外,如果可能的话,我也尽量避免使用可变结构。

+0

嘿,我从来没有这样做过。这是否意味着进入两个项目的项目属性并更改它以使它们具有相同的“程序集名称”但具有不同的名称空间?并创建第三个项目(一个类库项目),只包含共享类,并将其组合名称设置为相同的东西? – Aishwar

+0

(to aip.cd.aish)“尽量避免使用可变结构” - 哦,并避免公共领域('out t.X'告诉我这是一个公共领域) –

+0

没关系。得到它了。我创建了一个新的类库项目,并将输出的dll添加到两个项目中。 – Aishwar

0

在过去,我使用SerializationBinder将请求的类型转换为当前应用程序域中可用的等效类型。

不幸的是,我对GroupLab.Networking一无所知,因此我不确定您是否可以访问或覆盖执行序列化的例程。可以使用AppDomain.CurrentDomain.AssemblyResolve事件。为其分配一个委托并使用它来重定向到包含该类型的有效程序集。

1

您需要在两个应用程序共享的程序集中声明结构体。结构应该是这样的:

MyApp.Shared 
MyApp.ProgramOne 
MyApp.ProgramTwo 

这两个程序引用共享。然后他们将能够适当地序列化/反序列化。

+0

谢谢,你的回答很有帮助。 – Aishwar

相关问题