Atom飛行手冊翻譯: 4.4 Atom中的序列化

Atom中的序列化

當一個窗口被刷新,或者從上一次會話恢復的時候,視圖和它相關的對象會從JSON表達式中反序列化,它們在窗口上一次關閉時儲存。要使你本身的視圖和對象兼容刷新,你須要讓它們很好地執行序列化和反序列化。this

包的序列化鉤子

你的包的主模塊能夠選擇包含一個serialize方法,它在你的包反激活以前被調用。你應該返回JSON,它會交還給你做爲下次調用activate的參數。在下面的例子中,這個包將一個MyObject的實例在刷新過程當中保持相同的狀態。atom

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()

你想要序列化的對象須要實現.serialize(),這個方法須要返回一個序列化的對象。並且它必須包含一個叫作deserializer的鍵,它的值爲一個已註冊的反序列化器的名字,它可以轉換對象剩餘的數據。它一般是類的名稱自己。版本控制

@deserialize(data)

另外一方面是deserialize方法,它一般是個類級的方法,位於實現serialize方法相同的類中。它的做用是將一個上一次serialize調用返回的狀態對象轉化爲一個真正的對象。code

atom.deserializers.add(class)

你須要在你的類中調用atom.deserializers.add方法來使它對反序列化系統可見。如今你能夠帶着serialize返回的狀態調用全局的deserialize方法,你的類中的deserialize會自動被選擇。對象

版本控制

class MyObject
  atom.deserializers.add(this)

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

你的可序列化類能夠帶有一個可選的@version類級屬性,而且在序列化的狀態中持有version鍵。反序列化的時候,Atom只在版本匹配的時候嘗試對其反序列化,不然返回undefined。咱們計劃在將來實現一個遷移系統,可是如今至少能防止你對舊的狀態反序列化。io

相關文章
相關標籤/搜索