проблема с отправкой сериализованного объекта через tcpclient - PullRequest
1 голос
/ 01 ноября 2010

Я пытаюсь отправить объект через tcpclient с сервера на клиент, и я получаю сообщение об ошибке. Во-первых, вот класс упаковки:

[Serializable()]
    public class pack
    {
        public int a;
    }

вот код отправки сервера (его пространство имен - WindowsFormsApplication1):

                pack pachet = new pack();
                pachet.a = 3;
                IFormatter bformatter = new BinaryFormatter();
                NetworkStream ntstream = tcpClient.GetStream();
                bformatter.Serialize(ntstream, pachet);

и клиентский код перевода (его пространство имен - WindowsFormsApplication2):

            NetworkStream strm = client.GetStream();
            IFormatter bformatter = new BinaryFormatter();
            pack nettmp = (pack)bformatter.Deserialize(strm);

и ошибка:

serializationException was unhandeled. Unable to find assembly 'WindowsFormsApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Может кто-нибудь сказать мне, в чем проблема?

Ответы [ 4 ]

4 голосов
/ 01 ноября 2010

Ну, как говорится в сообщении об ошибке, ваш сервер не может найти сборку WindowsFormsApplication1.

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

Обратите внимание, что пространства имен не имеют значения - и вы не сможете десериализоватьобъект только потому, что у вас есть тип с тем же именем в клиентской сборке.Имя сборки встроено в данные сериализации.

(Лично я не очень заинтересован в использовании двоичной сериализации .NET по умолчанию для начала, поскольку она довольно хрупкая с точки зрения обратного и прямого управления версиями, но этодругое дело. Если вас интересуют альтернативы, вы можете рассмотреть текстовые форматы, такие как XML, YAML и JSON, или двоичные форматы, такие как Thrift и Protocol Buffers.)

2 голосов
/ 30 мая 2012

Для этой проблемы вам нужно скомпилировать и собрать библиотеку DLL, а затем добавить ее в качестве ссылки на оба проекта. Просто помните, что все классы в библиотеке DLL должны быть [Serializable].

1 голос
/ 01 ноября 2010

Вам необходимо добавить ссылку на WindowsFormsApplication1 на клиент. Или еще лучше: добавьте отдельную сборку для классов, которые являются общими как для клиента, так и для сервера.

0 голосов
/ 01 ноября 2010

Я нашел отличный способ сериализации, преобразовав сначала объект в xml, а затем в строку! http://www.dotnetjohn.com/articles.aspx?articleid=173

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...