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

Acr*_*ron 6 delphi serialization parsing

你好.

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

在客户端,我创建了TBest的对象,其中保存了产品ID,订购金额和用户.(所以这是一个订单的项目).

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

所以我创造了两个

TBest.toString: string;
Run Code Online (Sandbox Code Playgroud)

TBest.fromString(source: string): TBest;
Run Code Online (Sandbox Code Playgroud)

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

问题:有更好,更优雅的方式吗?序列化是一个关键字,是的,但序列化一个包含其他对象数组(在本例中为TBest)的对象(在本例中为TBestellung)时,并不是那么可怕/困难吗?

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

mjn*_*mjn 6

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

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

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


Mas*_*ler 5

不,如果反序列化代码知道如何读取它,则在主对象内部序列化内联子对象并不是特别麻烦或困难.XML总是这样做.DFM格式也是如此,而且效果很好.

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

另外,WRT你的小修正,如果TBest.fromString的目的是创建一个新的TBest对象,那么它应该被声明为构造函数,而不是静态的任何东西.这是Delphi的一个很酷的东西:我们可以为构造函数提供实际的描述性名称."创造"只是一种惯例.


zen*_*dar 5

您是否检查过Delphi已有的n层远程处理框架?我记得:

这些框架已有5年以上的市场,因此您可以获得已经解决和测试的所有丑陋细节.

编辑:关于定价的评论:

  • Datasnap包含在Delphi的Enterprise和Architect版本中.如果你有其中一个那么它是"免费的",如果你有德尔福专业,那么它将花费你.
  • kbmMW有一个免费版(查看他们的网站)