當一個窗口被刷新,或者從上一次會話恢復的時候,視圖和它相關的對象會從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()
,這個方法須要返回一個序列化的對象。並且它必須包含一個叫作deserializer
的鍵,它的值爲一個已註冊的反序列化器的名字,它可以轉換對象剩餘的數據。它一般是類的名稱自己。版本控制
另外一方面是deserialize
方法,它一般是個類級的方法,位於實現serialize
方法相同的類中。它的做用是將一個上一次serialize
調用返回的狀態對象轉化爲一個真正的對象。code
你須要在你的類中調用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