【问题标题】:How to stream data structure or record through NetworkStream?如何通过 NetworkStream 流式传输数据结构或记录?
【发布时间】:2012-05-11 19:09:54
【问题描述】:

我有以下数据结构或记录,我需要通过 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));

当我编译它时,它会引发一个异常,“这些参数没有重载写入。”

如何通过networkstream发送和接收数据结构或记录?

谢谢,

【问题讨论】:

  • sb 不是字节数组 (bytes[]),因此会引发异常。即 NetworkStream.Write(bytes[] buffer, int offset, int size)。我认为您需要先将记录序列化为字节数组。这可能并不简单,因为您的 Record 包含各种类型和字符串类型(获取可变长度的字符串大小需要特别注意)。

标签: .net tcpclient networkstream delphi-prism tcpserver


【解决方案1】:

您需要先将您的记录序列化为一个字节[]。

这会让你开始:

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

以下是序列化和反序列化给定类型的两种方法: http://dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays/ [注意:特别注意你如何处理字符串(它有可变大小)和你的自定义类型。]

【讨论】:

  • 我确实实现了 datacontractserializer。虽然编译器编译成功,但它没有工作。事实上,情况更糟。反序列化的字符串数据为空。此外,反序列化的 double 和 Integer 数据要么完全被包裹,要么不是正确的值。
  • 尝试另一种序列化方式。你试过dooba.net/2009/07/02/c-sharp-and-serializing-byte-arrays 方法吗?我用它成功地通过 NetworkStream 流式传输结构。正如我上面所说,鉴于自定义 DataTypes 并且您有一个字符串,您的记录很复杂(因此您需要获取实际的字符串大小)。尝试使用更简单的结构来尝试这种其他方法,这样您就可以放心了。然后破解你拥有的更复杂的记录。
猜你喜欢
  • 2012-03-26
  • 2015-08-12
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2017-04-27
相关资源
最近更新 更多