2010-03-05 5 views
1

У меня есть два разных приложения, и я использую GroupLab Networking для связи между ними. Идея заключается в том, что есть общий словарь, и когда что-то меняется в этом общем словаре, другое приложение получает уведомление. Часть уведомлений работает. Вот проблема. У меня есть следующий код в первом приложении.C# Чтение Сериализованных объектов между приложениями

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

Я понимаю, что эта проблема в том, что сериализация также хранит информацию сборки программы, сериализации его. Но мне нужно, чтобы он общался по разным программам. Как это сделать?

ответ

1

У вас есть TouchInfo, объявленный в двух разных сборках? Это плохая идея - у вас должна быть одна общая сборка, содержащая типы, требуемые обоими приложениями.

Лично я постараюсь избежать стандартизованной сериализации .NET по умолчанию, предпочитая что-то более контролируемое - я склонен к буферам протокола Google по разным причинам. Нуждается ли в 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

Смежные вопросы