オブジェクトのシリアル化

オブジェクトのシリアル化(直列化)とは,オブジェクトの内部状態をバイトストリームに変換し,そのバイトストリームから再び元と同じ内容を持ったオブジェクトを再現することができる機能のことです。ただし、すべてのデータクラスをシリアル化できるのではなく、serializableとして宣言する必要があります。このような機能はJavaやActionScript(AMF0、AMF3)にもあります。

早速使い方を説明していきます。まずは、CURL.IO.SERIALIZEパッケージをインポートします。

{import * from CURL.IO.SERIALIZE}

次に対象となるデータクラスを宣言します。このクラスはserializableとして宣言します。 

{define-class public serializable AAA
  field name:#String
  field value:#String
 
  {constructor {default name:#String = null, value:#String = null}
    set self.name = name
    set self.value = value
  }
  {method public {getNameAndValue}:#String
    {return self.name & ” ” & self.value}
  }
}

シリアライズするには、SerializeOutputStreamのwrite-oneメソッドを利用します。以下の例では、ファイル(test.byte)にシリアライズしたデータ(AAA)を保存しています。 

{with-open-streams
    out:SerializeOutputStream = {SerializeOutputStream 
                                    {write-open-byte {url “test.byte”}}}
 do
    {out.write-one {AAA name = “OKADA”, value = “123”}}
}

逆にデシリアライズ(バイトストリームから元のオブジェクトを生成)するには、deserializeプロシージャを利用します。ここでは上記で作成したファイルを読み込み、オブジェクトを生成しています。 

{with-open-streams
    in:SerializeInputStream = {SerializeInputStream 
                                  {read-open-byte {url “test.byte”}}}
 do
    let read-obj:AAA = {deserialize in, AAA}
    {dump {read-obj.getNameAndValue}}
}

実行結果

{read-obj.getNameAndValue}=OKADA 123