【问题标题】:Delphi 7 remobjects - serialize a componentDelphi 7 remobjects - 序列化组件
【发布时间】:2011-07-02 14:54:57
【问题描述】:

我有一个在 Delphi 7 和 RemObjects SDK 中构建的客户端-服务器应用程序。客户端和服务器之间的消息是二进制的 (http://wiki.remobjects.com/wiki/BinMessage)。我的问题是: 1)如果我用 TDataSet/TDataSource 填充数据并将它们从客户端发送到服务器,那么服务器组件的 DataSet 将包含数据吗?数据应该保持不变,不是吗? 2) 我尝试通过 RemObjects 发送组件,封装在 TROBinaryMemoryStream 后代类中,但没有成功

类定义

  TRODataSource=class(TROBinaryMemoryStream)
   private
     FNameDS:String;
     FDS:TDataSource;
     procedure SetName(aValue:String);
     procedure SetDS(aValue:TDataSource);
  public
   published
    property Name:String read FNameDS write SetName;
    property DataSource:TDataSource read FDS write SetDS;
  end;

发送数据源的方法

function foo(aDataSource: TDataSource):integer;
var
  wStream:TRODataSource;
begin
 wStream:=TRODataSource.Create;
 wStream.Name:='TEST';
 wStream.DataSource:=aDataSource;
 try
  Result:=(RORemoteService as ISvc..).foo1(wstream);//method existing on the server will //return how many records are in the dataset
 finally
  freeandnil(wstream);
 end;
end;

我们将不胜感激。

LE:似乎只有 TROComplexType 的后代类可以序列化http://wiki.remobjects.com/wiki/Remote_Object_Allocation_and_Serialization。但我不确定我是否不能序列化流上的组件。

【问题讨论】:

  • 序列化 TDataSet 可能更容易序列化纯数据。
  • 是的,我知道。我试图序列化一个数据源/数据集来构建某种框架,但这似乎比我预期的要难。

标签: delphi serialization delphi-7 remobjects


【解决方案1】:

当您将组件序列化为流时(请参阅我的另一篇文章),您可以使用“二进制”类型将流从服务器发送到客户端(和反向): http://wiki.remobjects.com/wiki/TROBinaryMemoryStream_Class

或者只是将其作为字符串发送:-)。无需重写 TROBinaryMemoryStream!

【讨论】:

  • 是的,我已经完成了。但现在的问题是,我必须注册类,所以 Delphi 知道它,以保留数据(因为 WriteComponent)。如果我要发送一个数据源,我会在服务器上收到一个具有 DataSet 属性 nil 的对象...我会尝试将它作为字符串发送。谢谢。
  • 是的,客户端和服务器都必须知道你发送什么样的对象。在默认的 Delphi TComponent 序列化的情况下,您必须使用“RegisterClass”以便 TComponent 可以反序列化它。当您将其作为字符串发送时也需要这样做
  • 你做过这样的事情吗? unit ... 初始化 RegisterClass(MyScrollBar); (参见 Delphi wiki 文章的演示)
【解决方案2】:

对于 TComponent/TPersistent 序列化(就像 Delphi 对 .dfm 文件所做的那样),您可以使用“ObjectTextToBinary”: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_ObjectTextToBinary@TStream@TStream.html

但是,如果您使用子对象(对象属性),则会出现问题。

您还可以搜索更通用的序列化(使用 RTTI)到 XML 等: Delphi (win32) serialization libraries Delphi Component Serialization

编辑:您可以将结果作为字符串发送到 RemObjects 中,也可以将其放入 TMemoryStream 并使用 RO Binary 类型。

【讨论】:

  • 感谢安德烈,我看过这个例子,而且 RRUIZ 的代码非常棒。但是我需要通过 RemObjects 发送这个(项目需求)。+1
猜你喜欢
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多