鍍金池/ 教程/ C++/ Atom中的序列化
調(diào)試
初始文件
作用域設(shè)置、作用域和作用域描述符
在Atom中移動
在Atom背后
Atom中的包
為什么選擇Atom?
從Textmate中轉(zhuǎn)換
小結(jié)
新手入門
折疊
代碼段
Hacking Atom
基本的自定義
Atom中的序列化
文本處理包
字?jǐn)?shù)統(tǒng)計包
所需工具
維護(hù)你的包
Atom基礎(chǔ)
深入鍵表(keymap)
配置API
使用Atom
自動補(bǔ)全
面板
在Atom中寫作
文本選擇
創(chuàng)建主題
圖標(biāo)
小結(jié)
開發(fā)Node模塊
編輯和刪除文本
安裝Atom
通過服務(wù)和其它包交互
小結(jié)
編寫 spec
語法
Atom中的版本控制
查找和替換

Atom中的序列化

當(dāng)一個窗口被刷新,或者從上一次會話恢復(fù)的時候,視圖和它相關(guān)的對象會從JSON表達(dá)式中反序列化,它們在窗口上一次關(guān)閉時儲存。要使你自己的視圖和對象兼容刷新,你需要讓它們很好地執(zhí)行序列化和反序列化。

包的序列化鉤子

你的包的主模塊可以選擇包含一個serialize方法,它在你的包反激活之前被調(diào)用。你應(yīng)該返回JSON,它會交還給你作為下次調(diào)用activate的參數(shù)。在下面的例子中,這個包將一個MyObject的實(shí)例在刷新過程中保持相同的狀態(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 }

.serialize()

你想要序列化的對象需要實(shí)現(xiàn).serialize(),這個方法需要返回一個序列化的對象。而且它必須包含一個叫做deserializer的鍵,它的值為一個已注冊的反序列化器的名字,它能夠轉(zhuǎn)換對象剩余的數(shù)據(jù)。它通常是類的名稱本身。

@deserialize(data)

另一方面是deserialize方法,它通常是個類級的方法,位于實(shí)現(xiàn)serialize方法相同的類中。它的作用是將一個上一次serialize調(diào)用返回的狀態(tài)對象轉(zhuǎn)化為一個真正的對象。

atom.deserializers.add(class)

你需要在你的類中調(diào)用atom.deserializers.add方法來使它對反序列化系統(tǒng)可見。現(xiàn)在你可以帶著serialize返回的狀態(tài)調(diào)用全局的deserialize方法,你的類中的deserialize會自動被選擇。

版本控制

class MyObject
  atom.deserializers.add(this)

  @version: 2
  @deserialize: (state) -> ...
  serialize: -> { version: @constructor.version, ... }

你的可序列化類可以帶有一個可選的@version類級屬性,并且在序列化的狀態(tài)中持有version鍵。反序列化的時候,Atom只在版本匹配的時候嘗試對其反序列化,否則返回undefined。我們計劃在未來實(shí)現(xiàn)一個遷移系統(tǒng),但是現(xiàn)在至少能防止你對舊的狀態(tài)反序列化。

上一篇:新手入門下一篇:Atom中的版本控制