2011-02-23 2 views
0

델파이 7과 RemObjects SDK에 클라이언트 - 서버 애플리케이션이 내장되어 있습니다. 클라이언트와 서버 간의 메시지는 2 진수입니다 (http://wiki.remobjects.com/wiki/BinMessage). 내 질문은 : 1) TDataSet/TDataSource 데이터를 채우고 클라이언트에서 서버로 보낸 경우 서버 구성 요소의 DataSet에 데이터가 포함됩니까? 데이터는 지속적으로 유지되어야합니까? 2)는 TROBinaryMemoryStream 자손 클래스에서 캡슐화 된 RemObjects에를 통해 구성 요소를 보내려고하지만, 한델파이 7 remobjects - 구성 요소를 serialize하십시오.

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; 

어떤 데이터 소스를 보내 succes에

클래스 정의

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; 

방법이없는 대답은 평가 절하 될 것이다.

LE : TROComplexType의 하위 클래스 만 직렬화 할 수 있습니다. http://wiki.remobjects.com/wiki/Remote_Object_Allocation_and_Serialization. 하지만 스트림에서 구성 요소를 serialize 할 수 없는지 확실하지 않습니다. (델파이 .DFM 파일을하는 것처럼) TComponent의/TPersistent의 직렬화를 들어

+0

TDataSet을 직렬화하는 대신 일반 데이터를 직렬화하는 것이 훨씬 쉬울 수도 있습니다. – mjn

+0

예, 알고 있습니다. 일종의 프레임 워크를 구축하기 위해 데이터 소스/데이터 집합을 직렬화하려고했지만 예상했던 것보다 어렵습니다. – RBA

답변

1

당신이 당신의 구성 요소가 스트림에 직렬화 한 때 서버에서 클라이언트로 스트림을 전송하기 위해 "바이너리"유형을 사용할 수 있습니다, (내 다른 게시물을 참조) (및 역방향) : http://wiki.remobjects.com/wiki/TROBinaryMemoryStream_Class

하거나 그것을 문자열로 보내십시오 :-). TROBinaryMemoryStream을 재정의 할 필요가 없습니다!

+0

예, 이미 완료했습니다. 하지만 문제는 Delphi가 클래스를 등록해야하므로 (WriteComponent 때문에) 데이터를 유지한다는 것입니다. DataSource를 보내고 있다면 DataSet 속성이 nil 인 객체를 서버에서 수신합니다 ... 문자열로 전송하려고합니다. 고맙습니다. – RBA

+0

예, 클라이언트와 서버 모두 보내는 개체의 종류를 알아야합니다. 기본 Delphi TComponent serialization의 경우 TComponent가이를 역 직렬화 할 수 있도록 "RegisterClass"를 사용해야합니다. 문자열 -EClassNotFound로 작업하지 않은 문자열 –

+0

으로 보낼 때도 필요합니다. – RBA

1

, 당신은 "ObjectTextToBinary"를 사용할 수 있습니다 : 당신이 하위 오브젝트 (객체 속성)을 사용하는 경우 http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/[email protected]@TStream.html

그러나,이 문제가 있습니다. 또한 XML 등으로보다 일반적인 직렬화 (RTTI를 사용)을 검색 할 수 있습니다

: Delphi (win32) serialization libraries Delphi Component Serialization

편집 : 당신은 RemObjects에 문자열로 결과를 보내거나 TMemoryStream이에 넣어와 RO를 사용할 수 있습니다 바이너리 타입.

+0

감사합니다 Andre,이 예제를 보았습니다. RRUIZ의 코드는 우수합니다. 하지만 이것을 RemObjects (프로젝트 요구)를 통해 보내야합니다. + 1 – RBA