Delphi:将对象传输到远程计算机

Delphi:将对象传输到远程计算机,delphi,parsing,serialization,Delphi,Parsing,Serialization,你好 我正在为网络使用编写一个二级订购软件。所以我们有客户机和服务器 在客户机上,我创建了TBest对象,其中保存了产品ID、金额和订单用户。(因此,这是订单的一项) 订单可以有多个项目,这些项目保存在一个数组中,以便稍后将创建的订单发送到服务器。保存数组的类称为TBestellung 所以我创造了两者 TBest.toString: string; 及 现在,我通过socket将toString结果发送到服务器,并在服务器上使用fromString(它解析接收到的属性)创建对象。这正是我们想

你好

我正在为网络使用编写一个二级订购软件。所以我们有客户机和服务器

在客户机上,我创建了TBest对象,其中保存了产品ID、金额和订单用户。(因此,这是订单的一项)

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

所以我创造了两者

TBest.toString: string;

现在,我通过socket将toString结果发送到服务器,并在服务器上使用fromString(它解析接收到的属性)创建对象。这正是我们想要的

问题: 有没有更好更优雅的方法?序列化是一个关键词,是的,但是当你序列化一个包含其他对象数组(本例中为TBest)的对象(本例中为TBestellung)时,这不是很糟糕/困难吗?


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

否,如果反序列化代码知道如何读取主对象内部的子对象数组,序列化这些子对象并不是特别混乱或困难。XML一直都在做类似的事情。DFM格式也是如此,它工作得很好

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


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

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

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

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

因此,每个子类只是简单地读写Delphi流,基类将其序列化为一个变量


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

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

  • (配有Delphi耳鼻喉科和足弓)
这些框架在市场上已经有5年多的时间了,所以所有难看的细节都已经解决并测试过了

编辑:关于定价的评论:

  • Datasnap包含在Delphi的企业版和架构师版中。如果你有一个,那么它是“免费的”,如果你有德尔福专业,那么它将花费你
  • kbmMW有一个免费版本(查看他们的网站)

    • Delphi有免费的序列化库(也有免费的Pascal):

      • JSON:和
      • XML:和
      JSON和XML是跨平台/跨语言的,这可能有助于将来与其他系统(例如基于PHP的web shop)的接口。它们也是自由开放的标准(没有供应商锁定)

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

      我们使用HitXML(开源),它会自动执行所有(反)序列化(使用RTTI):


      只要您使用已发布的方法(RTTI),并且您还可以使用“已启用trtti的数组”的属性,就可以正常工作。

      我在Delphi 2010中使用SuperObject: 搜索“Delphi 2010中的RTTI和编组”

      您应该看看“Delphi on Rails”项目:
      这台服务器正是您所需要的。

      不是一个很好的答案,而是对您的“小修改”的评论。您可能希望TBest类本身上的fromString方法使用静态方法(或在Delphi中调用的类方法),而不是静态类,但是toString方法只是TBest class.awrr上的常规函数,键入错误。尽管如此,还是要感谢+1的建议。如果我想得再久一点,我希望这就是我的结局+对于构造器的建议,D也没有看到,尽管这很明显。D推荐了自由构造器。DataSnap是免费的吗?请注意,DataSnap有两种风格:1)旧的基于DCOM的(提供身份验证/授权/加密,但安装起来可能很复杂,特别是没有AD域)2)新的基于dbExpress/TCP/HTTP的。也许更容易使用,但它缺乏任何安全功能。Delphi还支持SOAP。
      TBest.fromString(source: string): TBest;