Как передать структуру данных или записать через NetworkStream?

У меня есть следующая структура данных или запись, которую мне нужно передавать на другую машину и с нее через NetworkStream.

  TRemoteRecord = record
    command:TRemoteCommand;
    status:TRemoteStatus;
    signame:string;
    rvalue:double;
    ivalue:LongInt;
  end;

Именно так я отправляю или пишу структуру данных или записываю в поток.

TheStream:NetworkStream;
 SignalClient:TcpClient;
 SignalServer:TcpServer;
 sb:TRemoteRecord;

 SignalClient.ConnectNew(LocalIPEdit.Text,Int32.Parse(ClientPort.Text));
 TheStream := new NetWorkStream(SignalClient.Connect.DataSocket);
 TheStream.Write(sb, 0 SizeOf(sb));

Когда я компилирую его, он вызывает исключение: «Нет перегруженной записи с этими параметрами».

Как вы отправляете и получаете структуру данных или записываете через сетевой поток?

Спасибо,


person ThN    schedule 04.05.2012    source источник
comment
sb не является массивом байтов (bytes[]), поэтому возникает исключение. то есть NetworkStream.Write (буфер байтов [], int offset, int size). Я думаю, вам нужно сначала сериализовать свою запись в массив байтов. Это может быть непросто, так как ваша запись содержит различные типы и тип строки (получение размера строки переменной длины требует особого внимания).   -  person Forer    schedule 11.05.2012


Ответы (1)


Сначала вам нужно сериализовать свою запись в байт [].

Это поможет вам начать:

http://msdn.microsoft.com/en-us/library/ms752244.aspx

Вот два метода сериализации и десериализации заданного типа: http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/ [Примечание: обратите особое внимание на то, как вы обрабатываете строку (она имеет переменный размер) и пользовательские типы.]

person Forer    schedule 11.05.2012
comment
Я реализовал datacontractserializer. Хотя компилятор успешно скомпилирован, он не работает. На самом деле было хуже. Десериализованные строковые данные были пустыми. Кроме того, десериализованные двойные и целочисленные данные были полностью либо обернуты вокруг, либо имели неправильные значения. - person ThN; 16.05.2012
comment
Попробуйте другой способ сериализации. Вы пробовали dooba.net/2009/07/ 02/c-sharp-and-serializing-byte-arrays подход? Я использовал это для успешной потоковой передачи структуры через NetworkStream. Как я сказал выше, ваша запись сложна, учитывая пользовательские типы данных, и у вас есть строка (поэтому вам нужно получить фактический размер строки). Попробуйте этот другой подход с более простой структурой, чтобы быть уверенным, что он работает. Затем взломайте более сложную запись, которая у вас есть. - person Forer; 17.05.2012