【问题标题】:Delphi client server array sendingDelphi 客户端服务器数组发送
【发布时间】:2012-11-09 19:55:22
【问题描述】:

我需要从服务器向客户端发送一个动态对象数组。一个数组示例,它包含 Figure 类的对象及其坐标、颜色等信息。

我试图用这样的东西来发送数据:

for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
begin
  ServerSocket.Socket.Connections[i].SendText(some values); // then parsing this text to get values
end;

但我认为这样做真的很糟糕。那么,请您告诉我如何发送和接收一些对象数组的正确方法(使用IdTCPClient/ServerClient/ServerSockets)?

【问题讨论】:

  • 客户端在什么平台/语言上运行?那也是德尔福吗?
  • @SteveMayne 是的,它也是 Delphi。
  • 在 Delphi 中没有标准的方法来腌制/编组对象(据我所知)。您可以考虑使用 SOAP 进行这种通信:stackoverflow.com/questions/6415437/…
  • @Steve,在 Delphi 中有 JSON marshaling,但在 Delphi 7 中还没有。
  • @Danil,根本不需要将这些序列化数据存储到文件中。将它们存储在内存中(简单地存储在一些变量或一些复杂的缓冲区中)肯定很好,而且效率更高。

标签: delphi delphi-7 object-serialization


【解决方案1】:

您必须在客户端和服务器之间序列化您的动态数组。

第一次尝试是使用你自己的序列化,例如如果这是字符串数组或二进制序列化,则使用 #13#10 (CRLF) 分隔内容。

在 Delphi 7(及更高版本)下,您可以使用 our dynamic array wrapper,它可以序列化为 JSON 或二进制文件。它将使用可用的 RTTI 直接完成所有操作。它适用于所有基本类型:整数、浮点数、字符串、嵌套数组,但不适用于类实例。

对于对象的动态数组(类实例),您需要手动进行序列化。使用TReader 可能会有所帮助,或者您必须自己编写代码。最好将每一侧的所有项目序列化为一个流,然后一次发送内容,以获得更好的性能。

【讨论】:

  • 所以我没有办法直接做到吗?哦。我希望我可以使用你的包装器,但我不能使用非本地/非我的 delphi 库来完成我的任务,对不起。
  • @Danil,那么你就不走运了,因为编组是在 Delphi 2010 [+1ed] 中引入的。
  • @TLama 好吧,没关系。但是我认为我需要学习如何序列化东西!
  • 即使是较新版本的 Delphi 也无法编组对象数组,除非每个类都有自己的序列化程序。您可以对 Delphi 7 执行相同的操作,其中一些类,例如我们的其他库 mORMot 中包含的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多