robot
最新文章(10)
快樂的小成就
Pythonkey 計劃
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (91)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
儲存 Javascript 物件
by thinker
2 Columns
關鍵字:
javascript
在寫 $AjaxMind$ 時,我第一次使用 JSON 為格式,將 $javascript$ 物件輸出,並存檔。使用 Javascript 配合 JSON ,能很容易的將 Javascript 物件,轉換成可儲存的形式。而且, JSON 能很容易的在不同 programming language 間交換。但, JSON 卻有一個缺點,他是樹狀的。當有多個 object link/reference 到某個特定 object 時(該 object 為「多次被 reference 物件」),該特定 object 就會在 JSON 文件中,被多次描述。更不要說,然這些 link/reference 形成 loop 時。 {{{ a = {}; b = {}; a.p = b; b.k = a; // a 和 b 形成 loop }}} 在 linkname:MadSwatter http://www.assembla.com/spaces/MadSwatter 這個專案裡,我遇到必需將互相 reference 而產生 loop 的一群 object 存檔。然而, JSON 格式卻無法支援。解決這樣的問題,必需調整 object 之間的關係,使之成為 tree 的形式。為了 JSON 而進行調整,往往不是程式更複雜,或要維護兩個版本以上的結構,有「削足適履」之意。於是我另外寫了一組 function ,scan 整個 object set ,將「多次被 reference 物件」集中於一個 list "mobjs" 保管。並產生一組新的 object ,為新的 object 加入一個 property "__persist_mobj_map" ,將原 object 中 link 到「多次被 reference 物件」的 property ,對映到 "mobjs" 的 index 。透過這種對映,能移除直接的 link ,改以間接的 link ,以去除「多次被 reference 」的狀況。最後將 "mobjs" 和新產生的 objects 集合成一個 object ,就能以 JSON 格式輸出。 使用方式 {{{ a={}; b={}; a.p = b; b.k = a; pobj = persist(a); // 轉換成 tree 的結構 result = pobj.toJSONString(); pobj = result.parseJSON(function(){}); orig_a = persist.load(pobj); // 轉回原來的結構 }}} persist() 預設會將所有非 "__" 開頭的 property 都進行轉換。但 programmer 也可以為每一個物件設定 "__exports" property ,指定要轉換的 property 的名稱,其餘 property 不會出現在轉換後的物件裡。 {{{ function foo() {} foo.prototype.__exports = ["a", "b"]; obj = foo(); obj.a = 3; obj.b = 4; obj.c = 5; pobj = persist(obj); // 只有 pobj.a 和 pobj.b , obj.c 不被轉換 }}} 原始碼 * http://trac-hg.assembla.com/MadSwatter/browser/content/persist.js * http://trac-hg.assembla.com/MadSwatter/browser/content/json.js * Public Domain from somewhere where I have forgot.
最後更新時間: 2008-09-02 10:22:02 CST |
引用
查詢:
COMMENTS: