我有两个不同的应用程序,我正在使用GroupLab Networking在它们之间进行通信。这个想法是有一个共享字典,当这个共享字典发生变化时,另一个应用程序会收到通知。通知部分有效。这是问题所在。我在第一个应用程序中有以下代码。
TouchInfo t = new TouchInfo();
int.TryParse(txtXCoord.Text, out t.X);
int.TryParse(txtYCoord.Text, out t.Y);
this.sharedDictionary1["/pointOne"] = t;
TouchInfo
是struct
的位置。两个应用程序都可以访问存储在共享字典中的此对象。代码如下所示:
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'.
我意识到这个问题是因为序列化还存储了序列化程序的程序集信息。但我确实需要它来跨不同的程序进行交流。我如何使这项工作?
答案 0 :(得分:1)
您需要在两个应用程序共享的程序集中声明结构。结构应该是这样的:
MyApp.Shared
MyApp.ProgramOne
MyApp.ProgramTwo
两个程序都引用共享。然后他们就能够适当地序列化/反序列化。
答案 1 :(得分:1)
您是否在两个不同的程序集中声明了TouchInfo
?这是个坏主意 - 你应该有一个包含两个应用程序所需类型的通用程序集。
我个人试图避免使用默认的.NET二进制序列化,更喜欢更可控的东西 - 我出于各种原因偏向于Google Protocol Buffers。 GroupLab Networking 是否需要“正常”二进制序列化?
另外,如果可能的话,我也会尽量避免使用可变结构。
答案 2 :(得分:0)
过去我使用SerializationBinder将请求的类型转换为当前应用域中可用的等效类型。
可悲的是,我对GroupLab.Networking一无所知,所以我不确定你是否可以访问或覆盖执行序列化的例程。
另一种方法可能是使用AppDomain.CurrentDomain.AssemblyResolve
事件。为其分配一个委托,并使用该委托重定向到包含该类型的有效程序集。