オブジェクトのシリアル化(直列化)とは,オブジェクトの内部状態をバイトストリームに変換し,そのバイトストリームから再び元と同じ内容を持ったオブジェクトを再現することができる機能のことです。ただし、すべてのデータクラスをシリアル化できるのではなく、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