介面在可配置的情況下需要讀寫配置檔案,vcl提供了一種方式 treader 和 twriter 方式儲存介面資源。
object form1: tform1直接存成文字格式資源檔案,只要是物件繼承於tpersistent所有屬性欄位都能正常被初始化。同時他內部的子物件通過巢狀方式持久化。left = 0
top = 0
caption = '
form1
' ...
object lbl1: tlabel
left = 200
top = 152
...end
object btn1: tbutton
left = 184
...end
end
基於這種比較簡單的巢狀模式存貯方案。
1、讀取配置並生成介面的過程
先載入自身的屬性資訊
在載入子模組的配置資訊
觸發介面初始化載入事件
通過上述三步驟實現對類似delphi介面配置資訊的讀取。考慮到具體配置檔案格式的儲存位置和方式交由框架實現因此對其介面化
iviewstore實現了基本的讀寫屬性值的方式。
iviewstoreattributs介面並不是必須的,可以實現也可以不實現。增加這個介面的目的是為同乙個地方配置所有需要持久化的屬性。可以理解為publish的公共屬tfiler通過rtti獲取所需要持久化的資訊,方便在獲得所有相關的資訊。
1 //1 儲存屬性對於模組巢狀考慮2 ///
3 /// 介面需要儲存和還原的的屬性資訊
4 /// 為了減少複雜度,屬性資訊竟然不要巢狀
5 iviewstoreattributs = inte***ce
6 ['']7
function getcount: integer; stdcall;
8function getnames(index: integer): widestring; stdcall;
9function getvalues(index: integer): widestring; stdcall;
10procedure setvalues(index: integer; const value: widestring); stdcall;
11property count: integer read getcount;
12property names[index: integer]: widestring read getnames;
13property values[index: integer]: widestring read getvalues write setvalues;
14end;
1516 //1 介面資料儲存
17 ///
18 /// 用於儲存介面特有資料資訊
19 /// 比如檢視位置
20 iviewstore = inte***ce(iinte***ce)
21 ['
']22
procedure clear; stdcall;
23function count: integer; stdcall;
24procedure erase(const aname: widestring); stdcall;
25function exists(const aname: widestring): boolean; stdcall;
26function getnames(index: integer): widestring; stdcall;
27function getvalueofindex(index: integer): widestring; stdcall;
2829
function readbool(const aname: widestring; default: boolean): boolean; stdcall;
30function readfloat(const aname: widestring; default: double): double; stdcall;
31function readinteger(const aname: widestring; default: longint): longint; stdcall;
32function readstring(const aname, default: widestring): widestring; stdcall;
33procedure writebool(const aname: widestring; value: boolean); stdcall;
34procedure writefloat(const aname: widestring; value: double); stdcall;
35procedure writeinteger(const aname: widestring; value: longint); stdcall;
36procedure writestring(const aname, value: widestring); stdcall;
3738
procedure writeattribs(const attribs: iviewstoreattributs); stdcall;
39procedure readattribs(const attribs: iviewstoreattributs); stdcall;
40procedure write(const aname:widestring; out astore:iviewstore); stdcall;
41function read(const aname:widestring; out astore:iviewstore):boolean stdcall;
4243
property names[index: integer]: widestring read getnames;
44property valueofindex[index: integer]: widestring read getvalueofindex;
45end;
1使用write和read函式獲得iviewstore這樣外部不要考慮介面例項的具體建立方法。procedure writeattribs(const attribs: iviewstoreattributs); stdcall;
2procedure readattribs(const attribs: iviewstoreattributs); stdcall;
3procedure write(const aname:widestring; out astore:iviewstore); stdcall;
4function read(const aname:widestring; out astore:iviewstore):boolean stdcall;
同時對於一些簡單的物件只要實現iviewstoreattributs介面,在持久化和初始化的時候不用考慮誰幫你初始化。
如果要實現全自動載入,是否應該加強iviewstoreattributs介面就能達到目的?
redis持久化 AOF持久化
1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...
07 持久化配置
1.持久化物件 persistent object po pojo hbm對映配置 編寫規則 必須提供無引數 public 構造器 所有屬性 private,提供 public 的getter 和setter 方法 必須提供標識屬性,與資料表中主鍵對應 例如customer類id 屬性 po類屬性應...
redis持久化之AOF持久化
aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...