Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在应用程序之间读取序列化对象_C#_Serialization_Communication - Fatal编程技术网

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

C#在应用程序之间读取序列化对象,c#,serialization,communication,C#,Serialization,Communication,我有两个不同的应用程序,我使用GroupLab网络在它们之间进行通信。其思想是有一个共享字典,当此共享字典中的某些内容发生更改时,另一个应用程序将收到通知。通知部分起作用。问题就在这里。我在第一个应用程序中有以下代码 TouchInfo t = new TouchInfo(); int.TryParse(txtXCoord.Text, out t.X); int.TryParse(txtYCoord.Text, out t.Y); this.sharedDictionary1["/pointOn

我有两个不同的应用程序,我使用GroupLab网络在它们之间进行通信。其思想是有一个共享字典,当此共享字典中的某些内容发生更改时,另一个应用程序将收到通知。通知部分起作用。问题就在这里。我在第一个应用程序中有以下代码

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"]
MyApp.Shared
MyApp.ProgramOne
MyApp.ProgramTwo
而此代码在创建对象的应用程序中工作。我在第二次测试中得到以下错误:

{不可序列化对象:问题:System.Runtime.Serialization.SerializationException:找不到程序集“NetworkingTestProgramOne,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null”。

我意识到这个问题是因为序列化还存储了序列化程序的程序集信息。但是我确实需要它来在不同的程序之间进行通信。我如何做到这一点?

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

遗憾的是,我对GroupLab.Networking一无所知,因此我不确定您是否可以访问或重写执行序列化的例程


另一种方法可能是使用AppDomain.CurrentDomain.AssemblyResolve事件。为其分配一个委托,并使用该委托重定向到包含该类型的有效程序集。

您需要在两个应用程序共享的程序集中声明结构。结构应如下所示:

TouchInfo val = (TouchInfo)this.sharedDictionary1["/pointOne"]
MyApp.Shared
MyApp.ProgramOne
MyApp.ProgramTwo

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

您是否在两个不同的程序集中声明了
TouchInfo
?这是个坏主意-您应该有一个包含两个应用程序所需类型的公共程序集

就我个人而言,无论如何我都会尽量避免默认的.NET二进制序列化,更喜欢可控性更强的东西——出于各种原因,我倾向于使用Google协议缓冲区。GroupLab网络是否需要“正常”的二进制序列化


顺便说一句,如果可能的话,我也会尽量避免使用可变结构。

嘿,我以前从来没有这样做过。这是否意味着进入两个项目的项目属性,并将其更改为具有相同的“程序集名称”但不同的命名空间?以及创建第三个项目(类库项目)它只包含共享类并将其程序集名称设置为相同的名称?(对aip.cd.aish)“尽量避免使用可变结构”-哦,还要避免使用公共字段(
out t.X
告诉我它是公共字段)没关系。明白了。我创建了一个新的类库项目,获取了输出dll并将其添加到两个项目中。谢谢,您的回答很有帮助。