C#读取应用程序之间的序列化对象

时间:2010-03-05 04:42:33

标签: c# serialization communication

我有两个不同的应用程序,我正在使用GroupLab Networking在它们之间进行通信。这个想法是有一个共享字典,当这个共享字典发生变化时,另一个应用程序会收到通知。通知部分有效。这是问题所在。我在第一个应用程序中有以下代码。

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'.

我意识到这个问题是因为序列化还存储了序列化程序的程序集信息。但我确实需要它来跨不同的程序进行交流。我如何使这项工作?

3 个答案:

答案 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事件。为其分配一个委托,并使用该委托重定向到包含该类型的有效程序集。