2. TWriter方法的實現
⑴ WriteListBegin和WriteListEnd的實現
這兩個方法都是用於寫連續若干個相同類型的值。WriteListBegin寫入VaList標志,WriteListEnd寫入VaNull標志。
procedure TWriter.WriteListBegin;
begin
WriteValue(vaList);
end;
procedure TWriter.WriteListEnd;
begin
WriteValue(vaNull);
end;
這兩個方法都調用TWriter對象的WriteValue方法,該方法主要用於寫入TValueType類型的值。
procedure TWriter.WriteValue(Value: TValueType);
begin
Write(Value, SizeOf(Value));
end;
⑵ 簡單數據類型的寫入
簡單數據類型指的是整型、字符型、字符串型、浮點型、布爾型等。TWriter對象都定義了相應的寫入方法。
WriteInteger方法用於寫入整型數據。
procedure TWriter.WriteInteger(Value: Longint);
begin
if (Value >= -128) and (Value <= 127) then
begin
WriteValue(vaInt8);
Write(Value, SizeOf(Shortint));
end else
if (Value >= -32768) and (Value <= 32767) then
begin
WriteValue(vaInt16);
Write(Value, SizeOf(Smallint));
end else
begin
WriteValue(vaInt32);
Write(Value, SizeOf(Longint));
end;
end;
WriteInteger方法將整型數據分為8位、16位和32位三種,並分別用vaInt8、vaInt16和VaInt32。
WriteBoolean用於寫入布爾型數據:
procedure TWriter.WriteBoolean(Value: Boolean);
begin
if Value then
WriteValue(vaTrue) else
WriteValue(vaFalse);
end;
與其它數據類型不同的是布爾型數據只使用了標志位是存儲布爾值,在標志位後沒有數據。
WriteFloat方法用於寫入浮點型數據。
procedure TWriter.WriteFloat(Value: Extended);
begin
WriteValue(vaExtended);
Write(Value, SizeOf(Extended));
end;
字符串“True”、“False”和“nil”作為標識符傳入是由於Delphi的特殊需要。如果是“True”、“False”和“nil”則寫入VaTrue、VaFalse和VaNil,否則寫入VaIdent標志,接著以字符串形式寫入標識符。
WriteString方法用於寫入字符串
procedure TWriter.WriteString(const Value: string);
var
L: Integer;
begin
L := Length(Value);
if L <= 255 then
begin
WriteValue(vaString);
Write(L, SizeOf(Byte));
end else
begin
WriteValue(vaLString);
Write(L, SizeOf(Integer));
end;
Write(Pointer(Value)^, L);
end;
Delphi的字符串類型有兩種。一種長度小於256個字節,另一種長度小於65536 個字節。WriteString方法區分這兩類情況存儲字符串,一種設置VaStirng標志,另一種設置VaLString。然後存儲字符串的長度值,最後存儲字符串數據。
WriteChar方法用於寫入字符。
procedure TWriter.WriteChar(Value: Char);
begin
WriteString(Value);
end;
字符類型的讀寫是用讀寫字符串的方法,在讀的時候,判斷字節數為1時,則為字符型。