2010-11-01 3 views
1

Я пытаюсь отправить объект через tcpclient с сервера клиенту, и я получаю сообщение об ошибке. Во-первых, здесь есть класс пакет:проблема с отправкой сериализованного объекта по 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

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

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

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

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

+0

ОК .. от того, что я понимаю, мне нужно создать .dll с классом пакетов? Тогда я буду исследовать экспорт/импорт в xml. Спасибо – Alex

+0

@Badescu: Ну, ваша существующая сборка тоже сработает. (Вы также должны учесть следующие соглашения об именах .NET, где типы имеют паскаль.) –

+0

спасибо за xml-отзыв. Я использовал его, и он работает очень хорошо. – Alex

1

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

+0

по сборке вы имеете в виду .dll? – Alex

2

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

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