2012-05-04 10 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はバイト配列(bytes [])ではな​​いため、例外が発生します。すなわち、NetworkStream.Write(bytes []バッファ、intオフセット、intサイズ)。 まずレコードをバイト配列にシリアル化する必要があると思います。 レコードにはさまざまな型と文字列型が含まれています(可変長の文字列のサイズに注意する必要があります)。 – Forer

答えて

1

最初にレコードをバイト[]にシリアル化する必要があります。

これは、あなたが開始されます: http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/ [NB:あなたは、文字列を処理する方法には特に注意してください(それが変数を持っている。ここ

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

は、指定された型をシリアル化と逆シリアル化するには2つの方法ですサイズ)とカスタム型]

+0

私はdatacontractserializerを実装しました。コンパイラは正常にコンパイルされましたが、動作しませんでした。実際、それは悪かった。デシリアライズされた文字列データは空でした。さらに、逆シリアル化されたdoubleデータと整数データは完全にラップされていたか、正しい値ではありませんでした。 – ThN

+0

別の手段を試してみてください。 http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/アプローチを試しましたか? これを使用してNetworkStreamを介して構造体を正常にストリーミングしました。上で述べたように、カスタムDataTypesを使用するとレコードが複雑になり、文字列があるため(実際の文字列サイズを取得する必要があります)この簡単な構造体で他のアプローチを試してみてください。そうすれば、安心して動作させることができます。次に、あなたが持っているより複雑なレコードをあなたの方法でハックします。 – Forer

関連する問題