toObject(serialized_object = {}, debug = { use_default: false, annotate: false }){
        var result = {};
        var field = null;
        try {
            if( ! this.types )
                return result;

            var iterable = this.keys;
            for (var i = 0, field; i < iterable.length; i++) {
                field = iterable[i];
                var type = this.types[field];
                var object = type.toObject(((typeof serialized_object !== "undefined" && serialized_object !== null) ? serialized_object[field] : undefined), debug);
                result[field] = object;
                if(HEX_DUMP) {
                    var b = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN);
                    let has_value = typeof serialized_object !== "undefined" && serialized_object !== null
                    if(has_value) {
                        let value = serialized_object[field]
                        if(value)
                            type.appendByteBuffer(b, value);
                    }
                    b = b.copy(0, b.offset);
                    console.error(
                        this.operation_name+'.'+field,
                        b.toHex()
                    );
                }
            }
        } catch (error) {
            EC.throw(this.operation_name+'.'+field, error);
        }

        return result;
    }
@arg {boolean} [debug.use_default = false] - more template friendly
        @arg {boolean} [debug.annotate = false] - add user-friendly information