【问题标题】:Delphi: Transporting Objects to remote computersDelphi:将对象传输到远程计算机
【发布时间】:2010-03-08 22:37:22
【问题描述】:

你好。

我正在编写一个用于网络使用的 tier2 订购软件。所以我们有客户端和服务器。

在客户端上,我创建了 Tbest 的对象,其中保存了产品 ID、数量和订购它的用户。 (所以这是订单的一项)。

一个订单可以有多个项目,这些项目保存在一个数组中,以便稍后将创建的订单发送到服务器。保存数组的类称为 TBestellung

所以我创建了两个

TBest.toString: string;

TBest.fromString(source: string): TBest;

现在,我通过套接字将 toString 结果发送到服务器,并在服务器上使用 fromString 创建对象(它解析接收到的属性)。这按预期工作。

问题: 有没有更好、更优雅的方法来做到这一点?序列化是一个关键字,是的,但是当您序列化一个包含其他对象数组(在这种情况下为 Tbest)的对象(在这种情况下为 TBestellung)时,不是那么糟糕/困难吗?

//小修正:在被问到之前。是的,我应该为 toString 和 fromString 创建一个额外的(静态)类,因为否则服务器需要创建一个“空”T Best 才能使用 fromString。

【问题讨论】:

  • 不是一个完整的答案,而是对您的“小修改”的评论。除了静态类,您可能需要一个静态方法(或在 Delphi 中调用的类方法)用于 TBest 类本身的 fromString 方法,但 toString 方法只是您的 TBest 类上的常规函数​​。
  • awrr,输入错误。不过,谢谢

标签: delphi parsing serialization


【解决方案1】:

Delphi 有免费的序列化库(也适用于 Free Pascal):

JSON 和 XML 是跨平台/跨语言的,这可能有助于未来与其他系统的接口,例如基于 PHP 的网上商店。它们也是免费和开放的标准(没有供应商锁定)

更新:我不会使用基于构造函数的方法,虽然一开始可能看起来微不足道,但(反)序列化可能会成为一个复杂的过程,它将向需要序列化的类添加越来越多的非特定于类的代码.相反,我会使用 'builder' / 'parser' 类(工厂模式)来保持职责清晰和依赖性低。

【讨论】:

    【解决方案2】:

    不,如果反序列化代码知道如何读取子对象数组,那么在主对象内内联序列化子对象数组并不是特别混乱或困难。 XML 一直在做这样的事情。 DFM 格式也是如此,而且效果很好。

    没有魔法。重新创建对象的整个状态所需的所有数据都需要以一种或另一种方式从发送者传递到接收者。只要序列化器和反序列化器使用相同的协议,并且接收器能够重新创建发送器发送的相同对象,那么您的代码就可以正常工作并且不需要调整,除非它导致 significant 性能问题。

    另外,WRT 你的小修改,如果 TBest.fromString 的目的是创建一个新的 TBest 对象,那么它应该被声明为 构造函数,而不是静态的任何东西。这是关于 Delphi 的一个很酷的事情:我们可以给我们的构造函数提供实际的、描述性的名称。 “创建”只是一个约定。

    【讨论】:

    • +1 表示构造函数建议。如果我想得再久一点,希望这就是我的结局。 ;-)
    • +1 用于构造函数建议。D 没有看到,尽​​管它非常明显 .D
    【解决方案3】:

    您是否检查了 Delphi 已经可用的 n 层远程处理框架?我记得:

    这些框架已投放市场 5 年以上,因此所有丑陋的细节都已得到解决和测试。

    编辑:关于定价的评论:

    • Datasnap 包含在 Delphi 的 Enterprise 和 Architect 版本中。如果你有其中之一,那么它是“免费的”,如果你有 Delphi 专业版,那么它会花费你。
    • kbmMW 有一个免费版本(查看他们的网站)

    【讨论】:

    • 推荐免费的。 DataSnap 是免费的吗?
    • 请注意,Datasnap 有两种风格:1) 较旧的基于 DCOM 的一种(提供身份验证/授权/加密,但设置起来可能很复杂,尤其是没有 AD 域)2) 新的 dbExpress基于 /TCP/HTTP 的。也许更容易使用,但它缺乏任何安全功能。 Delphi 也支持 SOAP。
    【解决方案4】:

    我们使用 HitXML(开源),它会自动(使用 RTTI)进行所有(反)序列化: http://code.google.com/p/hitxml/

    只要你使用已发布的方法(RTTI)就可以工作,你也可以使用“TRTTIEnabled数组”的属性。

    【讨论】:

      【解决方案5】:

      我在 Delphi 2010 中使用 SuperObject: http://code.google.com/p/superobject/wiki/first_steps 并搜索“Delphi 2010 中的 RTTI 和编组”。

      您应该看看“Delphi On Rails”项目: http://code.google.com/p/delphionrails/ 这台服务器就是你所需要的。

      【讨论】:

        【解决方案6】:

        我们使用 TStreamable 基类序列化对象。这些类仅用于在 DCOM 客户端/服务器应用程序中的层/层之间传输信息。

        基类知道如何将一个常规的 Delphi 流从一个变体字节数组序列化到一个变体数组。 DCOM 接口中的接口方法采用变体参数,我们希望在客户端和服务器之间传递复杂的对象。

        我们还使我们的客户端和服务器版本保持同步,因此我们在不同版本的客户端和服务器之间没有任何版本问题。

        因此,每个子类只是简单地从 Delphi 流读取和写入数据,而基类将其序列化为一个变体。

        对于其他对象的集合,对我们来说,就像父对象将包含的对象的数量写入流中一样简单,然后要求每个包含的对象将自己附加到同一个流中。并在另一端简单地反转该过程。不用说,包含的类也继承自我们的 TStreamable 基类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-09
          • 2011-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 2017-12-09
          相关资源
          最近更新 更多