<!-- 譯者:Github@wizadforcel -->
# Atom中的序列化 #
當一個窗口被刷新,或者從上一次會話恢復的時候,視圖和它相關的對象會從JSON表達式中反序列化,它們在窗口上一次關閉時儲存。要使你自己的視圖和對象兼容刷新,你需要讓它們很好地執行序列化和反序列化。
## 包的序列化鉤子 ##
你的包的主模塊可以選擇包含一個`serialize`方法,它在你的包反激活之前被調用。你應該返回JSON,它會交還給你作為下次調用`activate`的參數。在下面的例子中,這個包將一個`MyObject`的實例在刷新過程中保持相同的狀態。
```
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`調用返回的狀態對象轉化為一個真正的對象。
### 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`。我們計劃在未來實現一個遷移系統,但是現在至少能防止你對舊的狀態反序列化。