|
@@ -0,0 +1,101 @@
|
|
|
+program EmptyRealWriter2;
|
|
|
+
|
|
|
+{$mode objfpc}{$h+}
|
|
|
+
|
|
|
+uses
|
|
|
+ SysUtils,
|
|
|
+ Classes,
|
|
|
+ Math;
|
|
|
+
|
|
|
+type
|
|
|
+ TMyComp = class(TComponent)
|
|
|
+ private
|
|
|
+ fI: Integer;
|
|
|
+ fL: Integer;
|
|
|
+ public
|
|
|
+ property I: Integer read fI write fI stored False default 1;
|
|
|
+ property L: Integer read fL write fL stored True;
|
|
|
+ end;
|
|
|
+
|
|
|
+ TMyComp2 = class(TMyComp)
|
|
|
+ published
|
|
|
+ property I stored True;
|
|
|
+ property L;
|
|
|
+ end;
|
|
|
+
|
|
|
+{ TMyComp }
|
|
|
+
|
|
|
+procedure CheckStringRead(const aReader: TBinaryObjectReader; const aExpectedValue: string);
|
|
|
+var
|
|
|
+ S: string;
|
|
|
+begin
|
|
|
+ S := aReader.ReadStr;
|
|
|
+ if S<>aExpectedValue then
|
|
|
+ raise Exception.CreateFmt('Reader error [''%s'' <> ''%s'']', [S, aExpectedValue]);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure CheckIntegerRead(const aReader: TBinaryObjectReader; const aExpectedValue: Integer);
|
|
|
+var
|
|
|
+ I: Integer;
|
|
|
+ B: Byte;
|
|
|
+begin
|
|
|
+ aReader.Read(B, 1);
|
|
|
+ case B of
|
|
|
+ Ord(vaInt8): I := aReader.ReadInt8;
|
|
|
+ Ord(vaInt16): I := aReader.ReadInt16;
|
|
|
+ Ord(vaInt32): I := aReader.ReadInt32;
|
|
|
+ else
|
|
|
+ raise Exception.Create('Reader error: wrong property');
|
|
|
+ end;
|
|
|
+
|
|
|
+ if not SameValue(I, aExpectedValue) then
|
|
|
+ raise Exception.CreateFmt('Reader error [''%f'' <> ''%f'']', [I, aExpectedValue]);
|
|
|
+end;
|
|
|
+
|
|
|
+var
|
|
|
+ xStream: TStream;
|
|
|
+ xWriter: TWriter;
|
|
|
+ C: TMyComp2;
|
|
|
+ xReader: TReader;
|
|
|
+ xObjReader: TBinaryObjectReader;
|
|
|
+begin
|
|
|
+ try
|
|
|
+ xStream := TMemoryStream.Create;
|
|
|
+ C := TMyComp2.Create(nil);
|
|
|
+ C.I := 1;
|
|
|
+
|
|
|
+ xWriter := TWriter.Create(xStream, 1024);
|
|
|
+ xWriter.WriteComponent(C);
|
|
|
+ C.Free;
|
|
|
+ xWriter.Free;
|
|
|
+ xStream.Position := 0;
|
|
|
+
|
|
|
+ xObjReader := TBinaryObjectReader.Create(xStream, 1);
|
|
|
+ CheckStringRead(xObjReader, 'TMyComp2');
|
|
|
+ CheckStringRead(xObjReader, '');
|
|
|
+ CheckStringRead(xObjReader, 'L');
|
|
|
+ CheckIntegerRead(xObjReader, 0);
|
|
|
+ if xObjReader.ReadInt16<>0 then
|
|
|
+ raise Exception.Create('Too many properties were streamed');
|
|
|
+ if xStream.Position <> xStream.Size then
|
|
|
+ raise Exception.CreateFmt('Too many properties were streamed %d <> %d.', [xStream.Position, xStream.Size]);
|
|
|
+ xObjReader.Free;
|
|
|
+ xStream.Position := 0;
|
|
|
+
|
|
|
+ C := TMyComp2.Create(nil);
|
|
|
+ xReader := TReader.Create(xStream, 1024);
|
|
|
+ xReader.BeginReferences;
|
|
|
+ xReader.ReadComponent(C);
|
|
|
+ xReader.EndReferences;
|
|
|
+ C.Free;
|
|
|
+ xReader.Free;
|
|
|
+ xStream.Free;
|
|
|
+ except
|
|
|
+ on E: Exception do
|
|
|
+ begin
|
|
|
+ Writeln('Error: ', E.ClassName);
|
|
|
+ WriteLn(E.Message);
|
|
|
+ Halt(1);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+end.
|