Skip to content
uupaa edited this page Jul 2, 2015 · 13 revisions

ユーザ定義型(USER_DEFINED_TYPE)は、ユーザが独自に定義した型/クラスを、 MessagePack で変換できるようにする仕組みです。

MessagePack#encode の options.pack と MessagePack#decode の options.unpack に関数を指定することで、ユーザが独自に定義した型やクラスをエンコード/デコードできます。

サポート可能な型の一覧 も参照してください。

How to use USER_DEFINED_TYPE

USER_DEFINED_TYPE を使うには、以下の手順に従い toJSON, pack, unpack 関数をあなたの定義したクラスに実装してください。

例として Foo クラスに toJSON, pack, unpack を追加してみましょう。

  1. define Foo class

        function Foo(a,   // @arg UINT8 = 0
                     b) { // @arg UINT8 = 0
            this._a = a || 0;
            this._b = b || 0;
        }
  2. implement Foo#toJSON function

    // Foo.toJSON では Foo インスタンスの内容を
    // MessagePack がネイティブにサポートしている型(Map, Number)を使ってエンコードします
    Foo.prototype.toJSON = function() {
        return {
            a: this._a,
            b: this._b
        };
    };
  3. 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;
    };
  4. 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);
    };
  5. export to global
    toJSON, pack, unpack 関数を実装した Foo クラスを global 名前空間に export してください

    window.Foo = Foo;

Clone this wiki locally