HxBitMini - Haxe向けの軽量シリアライズライブラリ
See GitHub for a description in English!
haxelibにも公開しました。
https://lib.haxe.org/p/hxbitmini/haxelib install hxbitmini して、 -lib hxbitmini するだけで使えます。
HxBitについて
HaxeにはHxBitというオブジェクトをシリアライズしてくれるライブラリがあります。
これは、Haxeを作り、HeapsIOを作り、Evolandを作った、Nicolas Cannasseによるライブラリで、事実上のHaxe標準みたいなやつです。
特徴はなんといっても、macroを使用して非常に高速なI/Oを可能にする強い型付けがされたコードを生成してくれる点、つまり実行時速度が早いです。
今回は、このHxBitをForkして、HxBitMiniを作りました。
HxBitの問題点
HxBitは Haxe Binary serialization and network synchronization library です。
ネットワーク同期を実現するために、シリアライズ時にユニークなIDを振って入れる、という挙動をするのですが、純粋なシリアライザーとして使う時には以下のような問題点があります。
- ユニークなIDの分データがでかくなる
- 内容は同じでもシリアライズするたびに結果が変わる
この問題点を解決するため、ネットワーク機能を削ぎ落としたHxBitMiniを作りました。
HxBit vs HxBitMini
HxBit
class Sample {
static function main() {
var target = new ElementList([new Element(1, 2), new Element(3, 4)]);
var element = (new hxbit.Serializer()).serialize(target);
trace(element.toHex());
}
}
class ElementList implements hxbit.Serializable {
public function new(a: Array<Element>) {
this.a = a;
}
@:s public var a: Array<Element>;
}
class Element implements hxbit.Serializable {
public function new(a: Int, b: Int) {
this.a = a;
this.b = b;
}
@:s public var a: Int;
@:s public var b: Int;
}HxBitMini
Serializerの使い方は完全に一緒、package nameのhxbitをhxbitminiに書き換えるだけです。
class Sample {
static function main() {
var target = new ElementList([new Element(1, 2), new Element(3, 4)]);
var element = (new hxbitmini.Serializer()).serialize(target);
trace(element.toHex());
}
}
class ElementList implements hxbitmini.Serializable {
public function new(a: Array<Element>) {
this.a = a;
}
@:s public var a: Array<Element>;
}
class Element implements hxbitmini.Serializable {
public function new(a: Int, b: Int) {
this.a = a;
this.b = b;
}
@:s public var a: Int;
@:s public var b: Int;
}結果
HxBit 0303010102020304 -> 8bytes (UID, ArrayLength, UID, a, b, UID, a, b)
HxBitMini 0301020304 -> 5bytes (ArrayLength, a, b, a, b)
これだけ小さなデータで、3bytesもの差が出ました。
ということで
HxBit使ってるけど、ネットワーク機能使ってないよ〜という方は、ぜひHxBitMiniに乗り換えましょう。
ちなみに
HxBitには、C#とJavaをターゲットにしたとき、Serializerを作るより先に対象のclassをNewしてないと死ぬというバグがあるのですが、これもしれっと治してあります。