W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
當(dāng)一個(gè)窗口被刷新,或者從上一次會(huì)話恢復(fù)的時(shí)候,視圖和它相關(guān)的對(duì)象會(huì)從JSON表達(dá)式中反序列化,它們?cè)诖翱谏弦淮侮P(guān)閉時(shí)儲(chǔ)存。要使你自己的視圖和對(duì)象兼容刷新,你需要讓它們很好地執(zhí)行序列化和反序列化。
你的包的主模塊可以選擇包含一個(gè)serialize
方法,它在你的包反激活之前被調(diào)用。你應(yīng)該返回JSON,它會(huì)交還給你作為下次調(diào)用activate
的參數(shù)。在下面的例子中,這個(gè)包將一個(gè)MyObject
的實(shí)例在刷新過(guò)程中保持相同的狀態(tài)。
module.exports =
activate: (state) ->
@myObject =
if state
atom.deserializers.deserialize(state)
else
new MyObject("Hello")
serialize: ->
@myObject.serialize()
class MyObject
atom.deserializers.add(this)
@deserialize: ({data}) -> new MyObject(data)
constructor: (@data) ->
serialize: -> { deserializer: 'MyObject', data: @data }
你想要序列化的對(duì)象需要實(shí)現(xiàn).serialize()
,這個(gè)方法需要返回一個(gè)序列化的對(duì)象。而且它必須包含一個(gè)叫做deserializer
的鍵,它的值為一個(gè)已注冊(cè)的反序列化器的名字,它能夠轉(zhuǎn)換對(duì)象剩余的數(shù)據(jù)。它通常是類的名稱本身。
另一方面是deserialize
方法,它通常是個(gè)類級(jí)的方法,位于實(shí)現(xiàn)serialize
方法相同的類中。它的作用是將一個(gè)上一次serialize
調(diào)用返回的狀態(tài)對(duì)象轉(zhuǎn)化為一個(gè)真正的對(duì)象。
你需要在你的類中調(diào)用atom.deserializers.add
方法來(lái)使它對(duì)反序列化系統(tǒng)可見(jiàn)?,F(xiàn)在你可以帶著serialize
返回的狀態(tài)調(diào)用全局的deserialize
方法,你的類中的deserialize
會(huì)自動(dòng)被選擇。
class MyObject
atom.deserializers.add(this)
@version: 2
@deserialize: (state) -> ...
serialize: -> { version: @constructor.version, ... }
你的可序列化類可以帶有一個(gè)可選的@version
類級(jí)屬性,并且在序列化的狀態(tài)中持有version
鍵。反序列化的時(shí)候,Atom只在版本匹配的時(shí)候嘗試對(duì)其反序列化,否則返回undefined
。我們計(jì)劃在未來(lái)實(shí)現(xiàn)一個(gè)遷移系統(tǒng),但是現(xiàn)在至少能防止你對(duì)舊的狀態(tài)反序列化。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: