2. Defineproperty和DefineBinaryproperty方法的實現
這兩個方法是虛方法,在TFiler中是抽象方法,在TReader和TWriter對象中才有具體的實現。
它們在TReader中的實現如下:
procedure TReader.DefineProperty(const Name: string; ReadData: TReaderProc;
WriteData: TWriterProc; HasData: Boolean);
begin
if CompareText(Name, FPropName) = 0 then
begin
ReadData(Self);
FPropName := '';
end;
end;
procedure TReader.DefineBinaryProperty(const Name: string;
ReadData, WriteData: TStreamProc; HasData: Boolean);
var
Stream: TMemoryStream;
Count: Longint;
begin
if CompareText(Name, FPropName) = 0 then
begin
if ReadValue <> vaBinary then
begin
Dec(FBufPos);
SkipValue;
FCanHandleExcepts := True;
PropValueError;
end;
Stream := TMemoryStream.Create;
try
Read(Count, SizeOf(Count));
Stream.SetSize(Count);
Read(Stream.Memory^, Count);
FCanHandleExcepts := True;
ReadData(Stream);
finally
Stream.Free;
end;
FPropName := '';
end;
end;
在兩個方法都將Name參數值與當前的屬性名比較,如果相同則進行讀操作。在DefineBinaryproperty中,創建了一個內存流。先將數據讀到內存流中然後調用ReadData讀取數據。
3. FlushBuffer的實現
FlushBuffer方法用於清除Reader對象的內部緩沖區中的內容,保持Reader對象和流在位置(Position)上的同步,其實現如下:
procedure TReader.FlushBuffer;
begin
FStream.Position := FStream.Position - (FBufEnd - FBufPos);
FBufPos := 0;
FBufEnd := 0;
end;
4. ReadListBegin、ReadListEnd和EndOfList方法
這三個方法都是用於從Reader對象的流中讀取一連串的項目,並且這些項目都由WriteListBegin寫入的標志標定開始和WriteListEnd寫入標志,標定結束,在讀循環中用EndOfList進行判斷。它們是在Reader對象讀取流中數據時經常用於的。它們的實現如下:
procedure TReader.ReadListBegin;
begin
CheckValue(vaList);
end;
procedure TReader.ReadListEnd;
begin
CheckValue(vaNull);
end;
function TReader.EndOfList: Boolean;
begin
Result := ReadValue = vaNull;
Dec(FBufPos);
end;
項目表開始標志是VaList,項目表結束標志是VaNull,VaList和VaNull都是枚舉類型TValueType定義的常量。
它們實現中調用的CheckValue是TReader的私有方法,其實現如下:
procedure TReader.CheckValue(Value: TValueType);
begin
if ReadValue <> Value then
begin
Dec(FBufPos);
SkipValue;
PropValueError;
end;
end;
CheckValue方法的功能是檢測緊接著要讀的值是否是Value指定的類型。如果不是則跳過該項目並觸發一個SInvalidPropertyValue錯誤。
EndOfList函數只是簡單地判斷下一字節是否是VaNull將判斷結果返回,並將字節移回原來位置。