C # Чтение сериализованных объектов между приложениями - PullRequest
1 голос
/ 05 марта 2010

У меня есть два разных приложения, и я использую 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'.

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

Ответы [ 3 ]

1 голос
/ 05 марта 2010

Вам необходимо объявить структуру в сборке, которая используется обоими приложениями. Структура должна быть примерно такой:

MyApp.Shared
MyApp.ProgramOne
MyApp.ProgramTwo

Обе программы ссылаются на Shared. Тогда они смогут соответствующим образом сериализоваться / десериализоваться.

1 голос
/ 05 марта 2010

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

Лично я бы в любом случае старался избегать бинарной сериализации .NET по умолчанию, предпочитая что-то более контролируемое - я склонен к буферам протокола Google по разным причинам. Требует ли GroupLab Networking "нормальная" двоичная сериализация?

Кроме того, я бы также старался избегать использования изменяемых структур, если это вообще возможно.

0 голосов
/ 05 марта 2010

В прошлом я использовал SerializationBinder для перевода запрошенного типа в эквивалентный тип, доступный в текущем домене приложения.

К сожалению, я ничего не знаю о GroupLab.Networking, поэтому я не уверен, можете ли вы получить доступ или переопределить подпрограммы, которые выполняют сериализацию.

Альтернативным подходом может быть использование события AppDomain.CurrentDomain.AssemblyResolve. Присвойте ему делегат и используйте его для перенаправления на действительную сборку, содержащую тип.

...