受益于对象层的灵活,文件存储变的比较简单!
以下是文件存储的实现代码
模型文件下载地址
http://www.onewone.com/designone/xDOM.dom
- {*******************************************************}
- //
- // 文件存储模板:以流的形式存储数据
- // 特点:1 受益于对象模型的灵活,使得文件的存储实现变的非常简单
- // 2 支持部分加载
- // 3 采用类方法的方式,即有比较好的结构性,也省去了对象的创建和销毁的开销
- //
- {*******************************************************}
- unit ModelFile;
- interface
- uses
- classes,
- ModelObject;
- type
- {DesignOne}
- {CodeTemplate}
- {<Object ObjectMapType=AllObjects>
- T[ObjectName]File=class
- public
- class function Load(ADataList:T[ObjectName]List;Reader:TReader;ALoadChild:boolean):boolean;
- class function Save(ADataList:T[ObjectName]List;Writer:TWriter;ASaveChild:boolean):boolean;
- class function LoadChild(Reader: TReader;AData: T[ObjectName];ALoadChild:boolean): boolean;
- class function SaveChild(Writer: TWriter;AData: T[ObjectName];ASaveChild:boolean): boolean;
- end;
- </Object>}
- {/CodeTemplate}
- {/DesignOne}
- TModelFile = class
- class function Load(AModelData:TModelData;Reader:TReader;ALoadChild:boolean):boolean;
- class function Save(AModelData:TModelData;Writer:TWriter;ASaveChild:boolean):boolean;
- end;
- implementation
- {DesignOne}
- {CodeTemplate}
- {<Object ObjectMapType=AllObjects>
- class function T[ObjectName]File.Load(ADataList: T[ObjectName]List;
- Reader: TReader;ALoadChild: boolean): boolean;
- var
- Data : T[ObjectName];
- i:Integer;
- MaxCount : integer;
- begin
- Result := False;
- ADataList.ClearList;
- MaxCount := Reader.ReadInteger;
- for i := 0 to MaxCount-1 do
- begin
- Data := T[ObjectName].create;
- with Data,Reader do begin
- <Property PropertyMapType=AllPropertys ObjectName=[ObjectName]>
- [PropertyName] := Read[VarTypeForFile];
- </Property>
- end;
- ADataList.Add[ObjectName](Data);
- if ALoadChild then T[ObjectName]File.LoadChild(Reader,Data,ALoadChild);
- end;
- Result := True;
- end;
- class function T[ObjectName]File.LoadChild(Reader: TReader; AData: T[ObjectName];
- ALoadChild: boolean): boolean;
- var
- j:integer;
- begin
- Result := False;
- <ObjectShip ObjectShipMapType=ChildObjects ObjectName=[ObjectName]>
- T[ObjectShipName]File.Load(AData.[ObjectShipName]List,Reader,ALoadChild);
- for j := 0 to AData.[ObjectShipName]List.Count-1 do AData.[ObjectShipName]List.Items[j].[ObjectName] := AData;
- </ObjectShip>
- Result := True;
- end;
- class function T[ObjectName]File.Save(ADataList: T[ObjectName]List;
- Writer: TWriter;ASaveChild: boolean): boolean;
- var
- Data : T[ObjectName];
- i:Integer;
- begin
- Result := False;
- Writer.WriteInteger(ADataList.Count);
- for i := 0 to ADataList.Count-1 do
- begin
- Data := ADataList.Items[i];
- with Data,Writer do begin
- <Property PropertyMapType=AllPropertys ObjectName=[ObjectName]>
- Write[VarTypeForFile]([PropertyName]);
- </Property>
- end;
- if ASaveChild then T[ObjectName]File.SaveChild(Writer,Data,ASaveChild);
- end;
- Result := True;
- end;
- class function T[ObjectName]File.SaveChild(Writer: TWriter; AData: T[ObjectName];
- ASaveChild: boolean): boolean;
- begin
- Result := False;
- <ObjectShip ObjectShipMapType=ChildObjects ObjectName=[ObjectName]>
- T[ObjectShipName]File.Save(AData.[ObjectShipName]List,Writer,ASaveChild);
- </ObjectShip>
- Result := True;
- end;
- </Object>}
- {/CodeTemplate}
- {/DesignOne}
- class function TModelFile.Load(AModelData: TModelData;Reader: TReader; ALoadChild: boolean): boolean;
- begin
- {DesignOne}
- {CodeTemplate}
- {<Object ObjectMapType=TopObjects>
- T[ObjectName]File.Load(AModelData.[ObjectName]List,Reader,ALoadChild);
- </Object>}
- {/CodeTemplate}
- {/DesignOne}
- end;
- class function TModelFile.Save(AModelData: TModelData;Writer: TWriter; ASaveChild: boolean): boolean;
- begin
- {DesignOne}
- {CodeTemplate}
- {<Object ObjectMapType=TopObjects>
- T[ObjectName]File.Save(AModelData.[ObjectName]List,Writer,ASaveChild);
- </Object>}
- {/CodeTemplate}
- {/DesignOne}
- end;
- end.