dubbo-go-hessian2: github.com/apache/dubbo-go-hessian2 Index | Files | Directories

package hessian

import "github.com/apache/dubbo-go-hessian2"

pack/unpack fixed length variable


Package Files

binary.go boolean.go codec.go const.go date.go decode.go doc.go double.go encode.go hessian.go int.go java8_time.go java_collection.go java_exception.go java_sql_time.go java_unknown_exception.go list.go long.go map.go null.go object.go pojo.go ref.go request.go response.go serialize.go string.go


const (
    TAG_READ        = int32(-1)
    ASCII_GAP       = 32
    CHUNK_SIZE      = 4096
    BC_BINARY       = byte('B') // final chunk
    BC_BINARY_CHUNK = byte('A') // non-final chunk

    BC_BINARY_DIRECT  = byte(0x20) // 1-byte length binary
    BINARY_DIRECT_MAX = byte(0x0f)
    BC_BINARY_SHORT   = byte(0x34) // 2-byte length binary
    BINARY_SHORT_MAX  = 0x3ff      // 0-1023 binary

    BC_DATE        = byte(0x4a) // 64-bit millisecond UTC date
    BC_DATE_MINUTE = byte(0x4b) // 32-bit minute UTC date

    BC_DOUBLE = byte('D') // IEEE 64-bit double

    BC_DOUBLE_ZERO  = byte(0x5b)
    BC_DOUBLE_ONE   = byte(0x5c)
    BC_DOUBLE_BYTE  = byte(0x5d)
    BC_DOUBLE_SHORT = byte(0x5e)
    BC_DOUBLE_MILL  = byte(0x5f)

    BC_FALSE = byte('F') // boolean false

    BC_INT = byte('I') // 32-bit int

    INT_DIRECT_MIN = -0x10
    INT_DIRECT_MAX = byte(0x2f)
    BC_INT_ZERO    = byte(0x90)

    INT_BYTE_MIN     = -0x800
    INT_BYTE_MAX     = 0x7ff
    BC_INT_BYTE_ZERO = byte(0xc8)

    BC_END = byte('Z')

    INT_SHORT_MIN     = -0x40000
    INT_SHORT_MAX     = 0x3ffff
    BC_INT_SHORT_ZERO = byte(0xd4)

    BC_LIST_VARIABLE         = byte(0x55)
    BC_LIST_FIXED            = byte('V')
    BC_LIST_FIXED_UNTYPED    = byte(0x58)

    BC_LIST_DIRECT         = byte(0x70)
    BC_LIST_DIRECT_UNTYPED = byte(0x78)
    LIST_DIRECT_MAX        = byte(0x7)

    BC_LONG         = byte('L') // 64-bit signed integer
    LONG_DIRECT_MIN = -0x08
    LONG_DIRECT_MAX = byte(0x0f)
    BC_LONG_ZERO    = byte(0xe0)

    LONG_BYTE_MIN     = -0x800
    LONG_BYTE_MAX     = 0x7ff
    BC_LONG_BYTE_ZERO = byte(0xf8)

    LONG_SHORT_MIN     = -0x40000
    LONG_SHORT_MAX     = 0x3ffff
    BC_LONG_SHORT_ZERO = byte(0x3c)

    BC_LONG_INT = byte(0x59)

    BC_MAP         = byte('M')
    BC_MAP_UNTYPED = byte('H')

    BC_NULL = byte('N') // x4e

    BC_OBJECT     = byte('O')
    BC_OBJECT_DEF = byte('C')

    BC_OBJECT_DIRECT  = byte(0x60)
    OBJECT_DIRECT_MAX = byte(0x0f)

    BC_REF = byte(0x51)

    BC_STRING       = byte('S') // final string
    BC_STRING_CHUNK = byte('R') // non-final string

    BC_STRING_DIRECT  = byte(0x00)
    STRING_DIRECT_MAX = byte(0x1f)
    BC_STRING_SHORT   = byte(0x30)
    STRING_SHORT_MAX  = 0x3ff

    BC_TRUE = byte('T')

    P_PACKET_CHUNK = byte(0x4f)
    P_PACKET       = byte('P')

    P_PACKET_DIRECT   = byte(0x80)
    PACKET_DIRECT_MAX = byte(0x7f)

    P_PACKET_SHORT   = byte(0x70)
    PACKET_SHORT_MAX = 0xfff
    ARRAY_STRING     = "[string"
    ARRAY_INT        = "[int"
    ARRAY_DOUBLE     = "[double"
    ARRAY_FLOAT      = "[float"
    ARRAY_BOOL       = "[boolean"
    ARRAY_LONG       = "[long"

    PATH_KEY      = "path"
    GROUP_KEY     = "group"
    INTERFACE_KEY = "interface"
    VERSION_KEY   = "version"
    TIMEOUT_KEY   = "timeout"

    STRING_NIL   = ""
    STRING_TRUE  = "true"
    STRING_FALSE = "false"
    STRING_ZERO  = "0.0"
    STRING_ONE   = "1.0"


const (
    Response_OK                byte = 20
    Response_CLIENT_TIMEOUT    byte = 30
    Response_SERVER_TIMEOUT    byte = 31
    Response_BAD_REQUEST       byte = 40
    Response_BAD_RESPONSE      byte = 50
    Response_SERVICE_NOT_FOUND byte = 60
    Response_SERVICE_ERROR     byte = 70
    Response_SERVER_ERROR      byte = 80
    Response_CLIENT_ERROR      byte = 90

    // According to "java dubbo" There are two cases of response:
    // 		1. with attachments
    // 		2. no attachments
    RESPONSE_WITH_EXCEPTION                  int32 = 0
    RESPONSE_VALUE                           int32 = 1
    RESPONSE_NULL_VALUE                      int32 = 2

Response related consts

const (
    // header length.

    // magic header
    MAGIC      = uint16(0xdabb)
    MAGIC_HIGH = byte(0xda)
    MAGIC_LOW  = byte(0xbb)

    // message flag.
    FLAG_REQUEST = byte(0x80)
    FLAG_TWOWAY  = byte(0x40)
    FLAG_EVENT   = byte(0x20) // for heartbeat
    SERIAL_MASK  = 0x1f

    DUBBO_VERSION                          = "2.5.4"
    DUBBO_VERSION_KEY                      = "dubbo"
    DEFAULT_DUBBO_PROTOCOL_VERSION         = "2.0.2" // Dubbo RPC protocol version, for compatibility, it must not be between 2.0.10 ~ 2.6.2
    DEFAULT_LEN                            = 8388608 // 8 * 1024 * 1024 default body max length


* the dubbo protocol header length is 16 Bytes.
* the first 2 Bytes is magic code '0xdabb'
* the next 1 Byte is message flags, in which its 16-20 bit is serial id, 21 for event, 22 for two way, 23 for request/response flag
* the next 1 Bytes is response state.
* the next 8 Bytes is package DI.
* the next 4 Bytes is package length.
const (
    JAVA_IDENT_REGEX = "(?:[_$a-zA-Z][_$a-zA-Z0-9]*)"
    CLASS_DESC       = "(?:L" + JAVA_IDENT_REGEX + "(?:\\/" + JAVA_IDENT_REGEX + ")*;)"
    ARRAY_DESC       = "(?:\\[+(?:(?:[VZBCDFIJS])|" + CLASS_DESC + "))"
    DESC_REGEX       = "(?:(?:[VZBCDFIJS])|" + CLASS_DESC + "|" + ARRAY_DESC + ")"


const (
    PackageError              = PackageType(0x01)
    PackageRequest            = PackageType(0x02)
    PackageResponse           = PackageType(0x04)
    PackageHeartbeat          = PackageType(0x08)
    PackageRequest_TwoWay     = PackageType(0x10)
    PackageResponse_Exception = PackageType(0x20)
    PackageType_BitSize       = 0x2f

enum part

const (
    // Zero : byte zero
    Zero = byte(0x00)


var (
    DubboRequestHeaderBytes       = [HEADER_LENGTH]byte{MAGIC_HIGH, MAGIC_LOW, FLAG_REQUEST}
    DubboResponseHeaderBytes      = [HEADER_LENGTH]byte{MAGIC_HIGH, MAGIC_LOW, Zero, Response_OK}
    DubboResponseHeartbeatHeader  = [HEADER_LENGTH]byte{MAGIC_HIGH, MAGIC_LOW, FLAG_EVENT}

Dubbo request response related consts

var (
    ErrHeaderNotEnough = perrors.New("header buffer too short")
    ErrBodyNotEnough   = perrors.New("body buffer too short")
    ErrJavaException   = perrors.New("got java exception")
    ErrIllegalPackage  = perrors.New("illegal package!")

Error part

var (
    ErrNotEnoughBuf    = perrors.Errorf("not enough buf")
    ErrIllegalRefIndex = perrors.Errorf("illegal ref index")

Error part

var DescRegex, _ = regexp.Compile(DESC_REGEX)

DescRegex ...

var NilValue = reflect.Zero(reflect.TypeOf((*interface{})(nil)).Elem())
var ZeroDate = time.Time{}

func AddrEqual Uses

func AddrEqual(x, y interface{}) bool

AddrEqual compares addrs

func ConvertSliceValueType Uses

func ConvertSliceValueType(destTyp reflect.Type, v reflect.Value) (reflect.Value, error)

ConvertSliceValueType convert to slice of destination type

func CopyMap Uses

func CopyMap(inMapValue, outMapValue reflect.Value) error

CopyMap copy from in map to out map

func CopySlice Uses

func CopySlice(inSlice, outSlice reflect.Value) error

CopySlice copy from inSlice to outSlice

func EncNull Uses

func EncNull(b []byte) []byte

/////////////////////////////////////// Null ///////////////////////////////////////

func EnsureFloat64 Uses

func EnsureFloat64(i interface{}) float64

EnsureFloat64 convert i to float64

func EnsureInt64 Uses

func EnsureInt64(i interface{}) int64

EnsureInt64 convert i to int64

func EnsureInterface Uses

func EnsureInterface(in interface{}, err error) (interface{}, error)

EnsureInterface get value of reflect.Value return original value if not reflect.Value

func EnsurePackValue Uses

func EnsurePackValue(in interface{}) reflect.Value

EnsurePackValue pack the interface with value

func EnsureRawValue Uses

func EnsureRawValue(in interface{}) reflect.Value

EnsureRawValue pack the interface with value, and make sure it's not a ref holder

func EnsureUint64 Uses

func EnsureUint64(i interface{}) uint64

EnsureUint64 convert i to uint64

func PackFloat64 Uses

func PackFloat64(v float64) []byte

PackFloat64 packs float64 to byte array [10].pack('G').bytes => [64, 36, 0, 0, 0, 0, 0, 0] PackFloat64 invokes go's official math library function Float64bits.

func PackInt16 Uses

func PackInt16(v int16) []byte

PackInt16 packs int16 to byte array [10].pack('N').bytes => [0, 0, 0, 10]

func PackInt32 Uses

func PackInt32(v int32) []byte

PackInt32 packs int32 to byte array [10].pack('N').bytes => [0, 0, 0, 10]

func PackInt64 Uses

func PackInt64(v int64) []byte

PackInt64 packs int64 to byte array [10].pack('q>').bytes => [0, 0, 0, 0, 0, 0, 0, 10]

func PackInt8 Uses

func PackInt8(v int8, b []byte) []byte

PackInt8 packs int to byte array

func PackPtr Uses

func PackPtr(v reflect.Value) reflect.Value

PackPtr pack a Ptr value

func PackUint16 Uses

func PackUint16(v uint16) []byte

PackUint16 packs uint16 to byte array [10].pack('N').bytes => [0, 0, 0, 10]

func ReflectResponse Uses

func ReflectResponse(in interface{}, out interface{}) error

ReflectResponse reflect return value TODO response object should not be copied again to another object, it should be the exact type of the object

func RegisterJavaEnum Uses

func RegisterJavaEnum(o POJOEnum) int

RegisterJavaEnum Register a value type JavaEnum variable.

func RegisterPOJO Uses

func RegisterPOJO(o POJO) int

RegisterPOJO Register a POJO instance. The return value is -1 if @o has been registered.

func RegisterPOJOMapping Uses

func RegisterPOJOMapping(javaClassName string, o interface{}) int

RegisterPOJOMapping Register a POJO instance. The return value is -1 if @o has been registered.

func RegisterPOJOs Uses

func RegisterPOJOs(os ...POJO) []int

RegisterPOJOs register a POJO instance arr @os. The return value is @os's mathching index array, in which "-1" means its matching POJO has been registered.

func SetCollectionSerialize Uses

func SetCollectionSerialize(collection JavaCollectionObject)

func SetJavaSqlTimeSerialize Uses

func SetJavaSqlTimeSerialize(time java_sql_time.JavaSqlTime)

SetJavaSqlTimeSerialize register serializer for java.sql.Time & java.sql.Date

func SetSerializer Uses

func SetSerializer(javaClassName string, codec Serializer)

func SetSlice Uses

func SetSlice(dest reflect.Value, objects interface{}) error

SetSlice set value into slice object

func SetTagIdentifier Uses

func SetTagIdentifier(s string)

SetTagIdentifier for customize struct filed tag of hessian, your can use it like:


type MyUser struct {

UserFullName      string   `json:"user_full_name"`
FamilyPhoneNumber string   // default convert to => familyPhoneNumber


var user MyUser hessian.NewEncoder().Encode(user)

func SetValue Uses

func SetValue(dest, v reflect.Value)

SetValue set the value to dest. It will auto check the Ptr pack level and unpack/pack to the right level. It make sure success to set value

func Slice Uses

func Slice(s string) (b []byte)

Slice convert string to byte slice

func SprintHex Uses

func SprintHex(b []byte) (rs string)

SprintHex converts the []byte to a Hex string.

func ToMapStringString Uses

func ToMapStringString(origin map[interface{}]interface{}) map[string]string

func UnRegisterPOJOs Uses

func UnRegisterPOJOs(os ...POJO) []int

UnRegisterPOJOs unregister POJO instances. It is easy for test.

func UnpackFloat64 Uses

func UnpackFloat64(b []byte) float64

UnpackFloat64 unpacks float64 from byte array Double (0,8).unpack('G)

func UnpackInt16 Uses

func UnpackInt16(b []byte) int16

UnpackInt16 unpacks int16 from byte array (0,2).unpack('n')

func UnpackInt32 Uses

func UnpackInt32(b []byte) int32

UnpackInt32 unpacks int32 from byte array (0,4).unpack('N')

func UnpackInt64 Uses

func UnpackInt64(b []byte) int64

UnpackInt64 unpacks int64 from byte array long (0,8).unpack('q>')

func UnpackPtr Uses

func UnpackPtr(v reflect.Value) reflect.Value

UnpackPtr unpack pointer value to original value

func UnpackPtrType Uses

func UnpackPtrType(typ reflect.Type) reflect.Type

UnpackPtrType unpack pointer type to original type

func UnpackPtrValue Uses

func UnpackPtrValue(v reflect.Value) reflect.Value

UnpackPtrValue unpack pointer value to original value return the pointer if its elem is zero value, because lots of operations on zero value is invalid

func UnpackUint16 Uses

func UnpackUint16(b []byte) uint16

UnpackUint16 unpacks int16 from byte array (0,2).unpack('n')

type DecimalSerializer Uses

type DecimalSerializer struct{}

func (DecimalSerializer) DecObject Uses

func (DecimalSerializer) DecObject(d *Decoder, typ reflect.Type, cls *classInfo) (interface{}, error)

func (DecimalSerializer) EncObject Uses

func (DecimalSerializer) EncObject(e *Encoder, v POJO) error

type Decoder Uses

type Decoder struct {
    // contains filtered or unexported fields

Decoder struct

func NewCheapDecoderWithSkip Uses

func NewCheapDecoderWithSkip(b []byte) *Decoder

NewCheapDecoderWithSkip generate a decoder instance with skip, only for cache pool, before decode Reset should be called. For example, with pooling use, will effectively improve performance

	var hessianPool = &sync.Pool{
		New: func() interface{} {
			return hessian.NewCheapDecoderWithSkip([]byte{})

	decoder := hessianPool.Get().(*hessian.Decoder)
	fill decode data
 decode anything ...

func NewDecoder Uses

func NewDecoder(b []byte) *Decoder

NewDecoder generate a decoder instance

func NewDecoderSize Uses

func NewDecoderSize(b []byte, size int) *Decoder

NewDecoder generate a decoder instance

func NewDecoderWithSkip Uses

func NewDecoderWithSkip(b []byte) *Decoder

NewDecoder generate a decoder instance with skip

func (*Decoder) Buffered Uses

func (d *Decoder) Buffered() int

func (*Decoder) Clean Uses

func (d *Decoder) Clean()

Clean clean the Decoder (room) for a new object decoding. Notice it won't reset reader buffer and will continue to read data from it.

func (*Decoder) Decode Uses

func (d *Decoder) Decode() (interface{}, error)

Decode parse hessian data, and ensure the reflection value unpacked

func (*Decoder) DecodeValue Uses

func (d *Decoder) DecodeValue() (interface{}, error)

DecodeValue parse hessian data, the return value maybe a reflection value when it's a map, list, object, or ref.

func (*Decoder) Discard Uses

func (d *Decoder) Discard(n int) (int, error)

Discard skips the next n bytes

func (*Decoder) ReadByte Uses

func (d *Decoder) ReadByte() (byte, error)

ReadByte read a byte from Decoder, advance the ptr

func (*Decoder) Reset Uses

func (d *Decoder) Reset(b []byte) *Decoder

type DubboHeader Uses

type DubboHeader struct {
    SerialID       byte
    Type           PackageType
    ID             int64
    BodyLen        int
    ResponseStatus byte

DubboHeader dubbo header

type Encoder Uses

type Encoder struct {
    // contains filtered or unexported fields

Encoder struct

func NewEncoder Uses

func NewEncoder() *Encoder

NewEncoder generate an encoder instance

func (*Encoder) Append Uses

func (e *Encoder) Append(buf []byte)

Append byte arr to encoder buffer

func (*Encoder) Buffer Uses

func (e *Encoder) Buffer() []byte

Buffer returns byte buffer

func (*Encoder) Clean Uses

func (e *Encoder) Clean()

Clean clean the Encoder (room) for a new object encoding.

func (*Encoder) Encode Uses

func (e *Encoder) Encode(v interface{}) error

Encode If @v can not be encoded, the return value is nil. At present only struct may can not be encoded.

type HessianCodec Uses

type HessianCodec struct {
    // contains filtered or unexported fields

HessianCodec defines hessian codec

func NewHessianCodec Uses

func NewHessianCodec(reader *bufio.Reader) *HessianCodec

NewHessianCodec generate a new hessian codec instance

func NewHessianCodecCustom Uses

func NewHessianCodecCustom(pkgType PackageType, reader *bufio.Reader, bodyLen int) *HessianCodec

NewHessianCodec generate a new hessian codec instance

func (*HessianCodec) ReadAttachments Uses

func (h *HessianCodec) ReadAttachments() (map[string]string, error)

ignore body, but only read attachments

func (*HessianCodec) ReadBody Uses

func (h *HessianCodec) ReadBody(rspObj interface{}) error

ReadBody uses hessian codec to read response body

func (*HessianCodec) ReadHeader Uses

func (h *HessianCodec) ReadHeader(header *DubboHeader) error

ReadHeader uses hessian codec to read dubbo header

func (*HessianCodec) Write Uses

func (h *HessianCodec) Write(service Service, header DubboHeader, body interface{}) ([]byte, error)

type IntegerSerializer Uses

type IntegerSerializer struct{}

func (IntegerSerializer) DecObject Uses

func (IntegerSerializer) DecObject(d *Decoder, typ reflect.Type, cls *classInfo) (interface{}, error)

func (IntegerSerializer) EncObject Uses

func (IntegerSerializer) EncObject(e *Encoder, v POJO) error

type JavaCollectionObject Uses

type JavaCollectionObject interface {
    Get() []interface{}
    JavaClassName() string

type JavaCollectionSerializer Uses

type JavaCollectionSerializer struct {

func (JavaCollectionSerializer) DecObject Uses

func (JavaCollectionSerializer) DecObject(d *Decoder, typ reflect.Type, cls *classInfo) (interface{}, error)

func (JavaCollectionSerializer) EncObject Uses

func (JavaCollectionSerializer) EncObject(e *Encoder, vv POJO) error

type JavaEnum Uses

type JavaEnum int32

JavaEnum type

const (
    InvalidJavaEnum JavaEnum = -1

invalid consts

type JavaEnumClass Uses

type JavaEnumClass struct {
    // contains filtered or unexported fields

JavaEnumClass struct

type JavaSqlTimeSerializer Uses

type JavaSqlTimeSerializer struct {

JavaSqlTimeSerializer used to encode & decode java.sql.Time & java.sql.Date

func (JavaSqlTimeSerializer) DecObject Uses

func (JavaSqlTimeSerializer) DecObject(d *Decoder, typ reflect.Type, cls *classInfo) (interface{}, error)


func (JavaSqlTimeSerializer) EncObject Uses

func (JavaSqlTimeSerializer) EncObject(e *Encoder, vv POJO) error


type Object Uses

type Object interface{}

Object is equal to Object of java When encoding

type POJO Uses

type POJO interface {
    JavaClassName() string // got a go struct's Java Class package name which should be a POJO class.

POJO interface !!! Pls attention that Every field name should be upper case. Otherwise the app may panic.

type POJOEnum Uses

type POJOEnum interface {
    String() string
    EnumValue(string) JavaEnum

POJOEnum enum for POJO

type POJORegistry Uses

type POJORegistry struct {
    // contains filtered or unexported fields

POJORegistry pojo registry struct

type PackageType Uses

type PackageType int

PackageType ...

type Request Uses

type Request struct {
    Params      interface{}
    Attachments map[string]string

func EnsureRequest Uses

func EnsureRequest(body interface{}) *Request

func NewRequest Uses

func NewRequest(params interface{}, atta map[string]string) *Request

NewRequest create a new Request

type Response Uses

type Response struct {
    RspObj      interface{}
    Exception   error
    Attachments map[string]string

Response dubbo response

func EnsureResponse Uses

func EnsureResponse(body interface{}) *Response

EnsureResponse check body type, make sure it's a Response or package it as a Response

func NewResponse Uses

func NewResponse(rspObj interface{}, exception error, attachments map[string]string) *Response

NewResponse create a new Response

type Serializer Uses

type Serializer interface {
    EncObject(*Encoder, POJO) error
    DecObject(*Decoder, reflect.Type, *classInfo) (interface{}, error)

func GetSerializer Uses

func GetSerializer(javaClassName string) (Serializer, bool)

type Service Uses

type Service struct {
    Path      string
    Interface string
    Group     string
    Version   string
    Method    string
    Timeout   time.Duration // request timeout

Service defines service instance

type TypeRefs Uses

type TypeRefs struct {
    // contains filtered or unexported fields

/////////////////////////////////////// typeRefs ///////////////////////////////////////

func (*TypeRefs) Get Uses

func (t *TypeRefs) Get(index int) reflect.Type

type UnknownException Uses

type UnknownException struct {
    SerialVersionUID     int64
    DetailMessage        string
    SuppressedExceptions []java_exception.Throwabler
    StackTrace           []java_exception.StackTraceElement
    Cause                java_exception.Throwabler
    // contains filtered or unexported fields

func (UnknownException) Error Uses

func (e UnknownException) Error() string

Error output error message

func (UnknownException) GetStackTrace Uses

func (e UnknownException) GetStackTrace() []java_exception.StackTraceElement

equals to getStackTrace in java

func (UnknownException) JavaClassName Uses

func (e UnknownException) JavaClassName() string

JavaClassName java fully qualified path



Package hessian imports 21 packages (graph) and is imported by 17 packages. Updated 2021-01-27. Refresh now. Tools for package owners.