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 (bytes [] buffer, int offset, int size). 먼저 레코드를 바이트 배열로 serialize해야한다고 생각합니다. 레코드가 다양한 유형과 문자열 유형 (가변 길이의 문자열 크기를 얻는 데 특별한주의가 필요함)이 있기 때문에 이것은 간단하지 않을 수 있습니다. – Forer

답변

1

먼저 레코드를 바이트 []에 직렬화해야합니다.

이것은 당신이 시작하는 것입니다 : 이 http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/ [NB가 : 당신이 문자열을 처리하는 방법에 특별한주의를 기울이 (가 변수를 가지고

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

여기 직렬화하고 지정된 유형을 역 직렬화하는 두 가지 방법이 있습니다 크기) 및 사용자 정의 유형].

+0

datacontractserializer를 구현했습니다. 컴파일러가 성공적으로 컴파일되었지만 작동하지 않았습니다. 사실, 그것은 더 나빴습니다. 비 직렬화 된 문자열 데이터는 비어 있습니다. 또한, deserialized double 및 Integer 데이터는 완전히 래핑되었거나 올바른 값이 아닙니다. – ThN

+0

다른 방법을 사용해보십시오. http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/ 접근을 시도 했습니까? NetworkStream을 통해 구조체를 성공적으로 스트리밍하는 데이 메서드를 사용했습니다. 위에서 말했듯이, 커스텀 DataTypes가 주어지면 레코드는 복잡해지며 문자열 (실제 문자열 크기를 가져와야 함)이 생깁니다. 이 다른 접근법을 간단한 구조체로 시도해보십시오. 따라서 마음의 평화를 얻을 수 있습니다. 그런 다음 복잡한 레코드를 통해 해킹하십시오. – Forer