【问题标题】:C# Reading Serialized Objects between ApplicationsC#在应用程序之间读取序列化对象
【发布时间】:2010-03-05 04:42:32
【问题描述】:

我有两个不同的应用程序,我正在使用 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'.

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

【问题讨论】:

    标签: c# serialization communication


    【解决方案1】:

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

    我个人会尽量避免默认的 .NET 二进制序列化,更喜欢更可控的东西 - 由于各种原因,我偏向于 Google 协议缓冲区。 GroupLab Networking 需要“正常”二进制序列化吗?

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

    【讨论】:

    • 嘿,我以前从未这样做过。这是否意味着进入两个项目的项目属性并更改它以使它们具有相同的“程序集名称”但不同的命名空间?并创建仅包含共享类的第三个项目(类库项目)并将其程序集名称设置为相同的东西?
    • (对 aip.cd.aish)“尽量避免使用可变结构”——哦,还要避免使用公共字段(out t.X 告诉我这是一个公共字段)
    • 没关系。知道了。我创建了一个新的类库项目并获取了输出 dll 并将其添加到两个项目中。
    【解决方案2】:

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

    MyApp.Shared
    MyApp.ProgramOne
    MyApp.ProgramTwo
    

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

    【讨论】:

    • 谢谢,您的回答很有帮助。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 2018-11-11
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多