2012-07-12 1 views
1

Я пытаюсь узнать сокеты udp и т. Д. Я создал два сервера и клиентских программ. Клиент отправляет пакет на сервер, сервер отскакивает от него.Не удается десериализовать объект, когда он отправлен в виде пакета

Это код, который я использую в обеих программах для преобразования данных в и из байта []

, но я получаю сообщение об ошибке при преобразовании из байт []

public static Packet Open(byte[] b) 
     { 
      MemoryStream memStream = new MemoryStream(); 
      BinaryFormatter binForm = new BinaryFormatter(); 
      memStream.Write(b, 0, b.Length); 
      memStream.Seek(0, SeekOrigin.Begin); 
      object obj = new object(); 
      try 
      { 
       // this line here is where the error is occurring 
       obj = (object)binForm.Deserialize(memStream); 
      } 
      catch (Exception er) 
      { 
       MessageBox.Show(er.Message); 
      } 
      if (obj is Packet) 
       return (Packet)obj; 
      else 
       return null; 
     } 

     public byte[] Bundle() 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      MemoryStream ms = new MemoryStream(); 
      bf.Serialize(ms, this); 
      return ms.ToArray(); 
     } 

Если я это все из одной программы она работает

Packet p =new Packet(); 
p.Message="hello"; 

byte[] data = p.Bundle(); 

Packet p2 = Packet.Open(data); 
MessageBox.Show(p2.Message); 

ошибка я получаю это «не удается найти сборку в„имя моего клиента программы“

AnyIdeas?

ответ

2

Звучит так, как будто вы сериализуете тип, который не используется через ссылку между обоими концами. Примечание: недостаточно одного и того же класса , поскольку BinaryFormatter включает полное имя типа, включая сборку, так что: он все равно будет считаться несвязанным типом. Общее исправление (и я использую слово «исправить» полностью неправильно) заключается в том, чтобы написать сборку для DTO и ссылаться на эту сборку как с клиента, так и с сервера. Однако этот подход все еще имеет много проблем.

Для получения информации имеются другие сериализаторы, которые являются, совместимыми только с аналогичным классом на каждом конце. Я предвзятый, но я бы предложил взглянуть на protobuf-net; вывод обычно значительно меньше, и он не привязан к типу, то есть класс просто должен быть широко подобным на каждом конце (он очень устойчив к версии). Плюс это быстрее (с процессором)!

+0

Это звучит как моя проблема. Я не хочу использовать третью вещь, я пытаюсь научиться ее делать. Поэтому мне пришлось бы написать класс, превратить его в dll и ссылаться на него в обоих приложениях, это правильно –

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