2012-05-04 6 views
0

У меня есть следующая структура данных или запись, которые мне нужно передать на другую машину и через нее через 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)); 

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

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

Спасибо,

+0

sb не является массивом байтов (байты []), поэтому исключение возникает. т. Е. NetworkStream.Write (байты [] buffer, int offset, int size). Я думаю, вам нужно сначала сериализовать свою запись в массив байтов. Это может быть несложно, так как ваша запись содержит различные типы и тип строки (получение размера строки переменной длины требует особого внимания). – Forer

ответ

1

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

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

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

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

+0

Я реализовал datacontractserializer. Хотя компилятор успешно скомпилирован, он не работает. На самом деле это было хуже. Данные десериализованной строки были пустыми. Кроме того, десериализованные данные double и Integer были полностью обернуты или были неправильными значениями. – ThN

+0

Попробуйте другое средство для сериализации. Пробовали ли вы http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/ подход? Я использовал это для потоковой передачи структуры через NetworkStream. Как я сказал выше, ваша запись сложна с учетом пользовательских DataTypes, и у вас есть строка (так что вам нужно получить фактический размер строки). Дайте этому другому подходу попробовать более простую структуру, чтобы у вас было душевное спокойствие. Затем взломайте свой путь через более сложную запись. – Forer