Atom Atom中的序列化

2018-08-12 21:50 更新

Atom中的序列化

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

包的序列化鉤子

你的包的主模塊可以選擇包含一個(gè)serialize方法,它在你的包反激活之前被調(diào)用。你應(yīng)該返回JSON,它會交還給你作為下次調(diào)用activate的參數(shù)。在下面的例子中,這個(gè)包將一個(gè)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(),這個(gè)方法需要返回一個(gè)序列化的對象。而且它必須包含一個(gè)叫做deserializer的鍵,它的值為一個(gè)已注冊的反序列化器的名字,它能夠轉(zhuǎn)換對象剩余的數(shù)據(jù)。它通常是類的名稱本身。

@deserialize(data)

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

atom.deserializers.add(class)

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

版本控制

class MyObject
  atom.deserializers.add(this)

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

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

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號