首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi TWriter 元件寫入與基礎型別序列化完整源碼實現

     編輯:Delphi

⑶ 元件寫入方法實現

TWriter 元件寫入相關方法:WriteSignature、WritePrefix、WriteComponent、WriteDescendant、WriteRootComponent。

WriteSignature

procedure TWriter.WriteSignature;
begin Write(FilerSignature, SizeOf(FilerSignature)); end;

FilerSignature = 'TPF0'。

WritePrefix

寫入 ffInherited/ffChildPos 標誌。Prefix := $F0 or Byte(Flags),若 ffChildPos 置位再寫入建立序號。

WriteComponent

procedure TWriter.WriteComponent(Component: TComponent);
begin
  Include(Component.FComponentState, csWriting);
  if Assigned(FAncestorList) then Ancestor := FindAncestor(Component.Name);
  Component.WriteState(Self);
  Exclude(Component.FComponentState, csWriting);
end;

透過 WriteState 寫入屬性,前後以 csWriting 標記。

WriteDescendant / WriteRootComponent

procedure TWriter.WriteDescendant(Root, AAncestor: TComponent);
begin
  FRootAncestor := AAncestor; FAncestor := AAncestor; FRoot := Root;
  WriteSignature; WriteComponent(Root);
end;

procedure TWriter.WriteRootComponent(Root: TComponent);
begin WriteDescendant(Root, nil); end;

WriteRootComponent 以 nil 祖先呼叫 WriteDescendant,即完整寫入。

2. TWriter 方法實現細節

⑴ WriteListBegin / WriteListEnd

procedure TWriter.WriteListBegin; begin WriteValue(vaList); end;
procedure TWriter.WriteListEnd;   begin WriteValue(vaNull); end;

procedure TWriter.WriteValue(Value: TValueType);
begin Write(Value, SizeOf(Value)); end;

⑵ 簡單型別寫入實現

  • Integer:依大小分 vaInt8 (1 位元組)、vaInt16 (2 位元組)、vaInt32 (4 位元組)
  • Boolean:僅寫型別標誌 vaTrue/vaFalse,無資料位元組
  • Float:vaExtended + 10 位元組資料
  • String:長度 ≤255 用 vaString + 1 位元組長度;否則 vaLString + 4 位元組長度。最後寫入字串內容
  • Char:直接呼叫 WriteString,讀取時判斷長度=1 識別
  • Ident:True/False/nil 寫對應標誌;其他寫 vaIdent + 長度 + 內容
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved