-
Notifications
You must be signed in to change notification settings - Fork 1
USER_DEFINED_TYPE
uupaa edited this page Jul 2, 2015
·
13 revisions
ユーザ定義型(USER_DEFINED_TYPE)は、ユーザが独自に定義した型/クラスを、 MessagePack で変換できるようにする仕組みです。
MessagePack#encode の options.pack と MessagePack#decode の options.unpack に関数を指定することで、ユーザが独自に定義した型やクラスをエンコード/デコードできます。
サポート可能な型の一覧 も参照してください。
USER_DEFINED_TYPE を使うには、以下の手順に従い toJSON, pack, unpack 関数をあなたの定義したクラスに実装してください。
例として Foo クラスに toJSON, pack, unpack を追加してみましょう。
-
define Foo class
function Foo(a, // @arg UINT8 = 0 b) { // @arg UINT8 = 0 this._a = a || 0; this._b = b || 0; }
-
implement Foo#toJSON function
// Foo.toJSON では Foo インスタンスの内容を // MessagePack がネイティブにサポートしている型(Map, Number)を使ってエンコードします Foo.prototype.toJSON = function() { return { a: this._a, b: this._b }; };
-
implement Foo.pack function
Foo.pack 関数で source で受け取った Foo クラスのインスタンスをバイナリデータに変換します。Foo.pack = function(source) { // @arg Any (Foo class instance) // @ret Uint8Array // 1. 先ほど実装した Foo#toJSON と MessagePack.encode を使うと簡単です return MessagePack.encode( source.toJSON() ); // 2. 効率を求めるなら自前でバイナリデータ化してもよいでしょう var result = new Uint8Array(2); result[0] = source._a; result[1] = source._b; return result; };
-
implement Foo.unpack function
Foo.unpack 関数はバイナリデータから、Foo クラスのインスタンスを復元し返してください。Foo.unpack = function(source) { // @arg Uint8Array // @ret Any // 1. MessagePack.decode を使い // バイナリデータからインスタンスの復元に必要なデータを取り出します var json = MessagePack.decode(source); return new Foo(json.a, json.b); // 2. 効率を求めるなら自前でバイナリデータからインスタンスを復元してもよいでしょう var a = source[0]; // UINT8 var b = source[1]; // UINT8 return new Foo(a, b); };
-
export to global
toJSON, pack, unpack 関数を実装した Foo クラスを global 名前空間に export してくださいwindow.Foo = Foo;