hessian

package module
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 15, 2019 License: Apache-2.0 Imports: 14 Imported by: 0

README

This is a feature-complete golang hessian serializer.

It's cloned from viant/gohessian , and do the following works:

  • fix lots of bugs
  • large scope refactoring to let code structure simple and human-friendly
  • add ref and date features implement
  • more unit tests
  • api refactoring

Usage

name map and type map

  • name map: a map[string]string used by encoder to determine the class name of a object
  • type map: a map[string]reflect.Type used by decoder to determine the type of instance to initialize

You can use function hessian.ExtractTypeNameMap(interface{}) to generate both the type map and name map. It's the recommendation way. Of course, you can create by yourself, but make sure them contain all names and types which encoder and decoder needed.

simple example

type circular struct {
	Num      int
	Previous *circular
	Next     *circular
}

func main() {
	c := &circular{}
	c.Num = 12345
	c.Previous = c
	c.Next = c

	// create hessian serializer
	serializer := hessian.NewSerializer(hessian.ExtractTypeNameMap(c))

	fmt.Println("source object: ", c)

	// encode to bytes
	bytes, err := serializer.ToBytes(c)
	if err != nil {
		panic(err)
	}

	// decode from bytes
	decoded, err := serializer.ToObject(bytes)
	if err != nil {
		panic(err)
	}
	fmt.Println("decode object: ", decoded)
}

using java class name

You can define a function HessianCodecName() string for your struct if using hessian.ExtractTypeNameMap(interface{}) to generate type map and name map.

type TraceVo struct {
	Key   string
	Value string
}

func (TraceVo) HessianCodecName() string {
	return "hessian.TraceVo"
}

typeMap,nameMap := hessian.ExtractTypeNameMap(&TraceVo{})

If you create type map and name map manually, you should also add the java class name mapping.

concurrently

hessian.NewSerializer contains serialization processing data, so a serializer can't be used concurrently, you should create a new one when needed.

If there is only one type of data to serialize , a goroutine can continue use the same serializer to ToBytes() or ToObject().

streaming transport

The following is a client-server streaming transport example:

server side:

_,nameMap := hessian.ExtractTypeNameMap(object)
encoder := hessian.NewEncoder(outputStreamWriter, nameMap) // write stream to outputStreamWriter
for {
    data := getNewData()
    err = encoder.Write(data) // write new data
    if err != nil {
        panic(err)
    }
}

client side:

typeMap,_ := hessian.ExtractTypeNameMap(object)
decoder := hessian.NewDecoder(inputStreamReader, typeMap) // read stream from inputStreamReader
for {
    obj,err := decoder.Read() // read new object
    if err != nil {
        panic(err)
    }
    
    // process obj
}

Reference

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	StringChunkSizeBytes = []byte{byte(strChunkSize >> 8), byte(strChunkSize)}
)

Functions

func AddrEqual

func AddrEqual(x, y interface{}) bool

func ConvertSliceValueType

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

func ElemKind

func ElemKind(k reflect.Kind) bool

ElemKind check whether k is elem kind, a value of which kind can call func Elem()

func EnsureFloat64

func EnsureFloat64(i interface{}) float64

EnsureFloat64 convert i to float64

func EnsureInt64

func EnsureInt64(i interface{}) int64

EnsureInt64 convert i to int64

func EnsureInterface

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

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

func EnsurePackValue

func EnsurePackValue(in interface{}) reflect.Value

EnsurePackValue pack the interface with value

func EnsureRawValue

func EnsureRawValue(in interface{}) reflect.Value

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

func EnsureUint64

func EnsureUint64(i interface{}) uint64

EnsureUint64 convert i to uint64

func ExtractTypeNameMap

func ExtractTypeNameMap(v interface{}) (map[string]reflect.Type, map[string]string)

ExtractTypeNameMap from reflect value

func ExtractValue

func ExtractValue(v reflect.Value, extractor ValueExtractor)

ExtractValue info

func FetchType

func FetchType(typ reflect.Type, typMap map[string]reflect.Type)

FetchType map

func FloatKind

func FloatKind(k reflect.Kind) bool

FloatKind check whether k is float kind

func IntKind

func IntKind(k reflect.Kind) bool

IntKind check whether k is int kind

func IsRawKind

func IsRawKind(k reflect.Kind) bool

IsRawKind check whether k is raw kind

func NameMapFrom

func NameMapFrom(v interface{}) map[string]string

NameMapFrom instance

func PackPtr

func PackPtr(v reflect.Value) reflect.Value

PackPtr pack a Ptr value

func RawValue

func RawValue(v reflect.Value) reflect.Value

RawValue unpack value to raw value. NOTE: it may be the zero value return value of pointer pointed if it's pointer

func SetLogger

func SetLogger(l logger.Logger)

SetLogger set new logger

func SetSlice

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

SetSlice set value into slice object

func SetValue

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 ToBytes

func ToBytes(object interface{}, nameMap map[string]string) ([]byte, error)

ToBytes [NO-CACHE API] serialize object to bytes

func ToObject

func ToObject(ins []byte, typMap map[string]reflect.Type) (interface{}, error)

ToObject [NO-CACHE API] deserialize bytes to object

func TypeMapFrom

func TypeMapFrom(v interface{}) map[string]reflect.Type

TypeMapFrom instance

func TypeMapOf

func TypeMapOf(typ reflect.Type) map[string]reflect.Type

TypeMapOf type

func TypeName

func TypeName(t reflect.Type) string

TypeName return the name of type

func UintKind

func UintKind(k reflect.Kind) bool

UintKind check whether k is uint kind

func UnpackPtr

func UnpackPtr(v reflect.Value) reflect.Value

UnpackPtr unpack pointer value to original value

func UnpackPtrType

func UnpackPtrType(typ reflect.Type) reflect.Type

UnpackPtrType unpack pointer type to original type

func UnpackPtrValue

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

Types

type ByteRuneReader

type ByteRuneReader interface {
	io.Reader
	io.RuneReader
}

type ClassDef

type ClassDef struct {
	FullClassName string
	FieldName     []string
}

ClassDef class def

type CodecErr

type CodecErr struct {
	Message string
	Err     error
}

CodecErr is returned when the codec encounters an error.

func (CodecErr) Error

func (e CodecErr) Error() string

type CodecNamable

type CodecNamable interface {
	HessianCodecName() string
}

CodecNamable to define codec name for hessian

type Decoder

type Decoder struct {
	// contains filtered or unexported fields
}

Decoder type

func NewDecoder

func NewDecoder(r ByteRuneReader, typ map[string]reflect.Type) *Decoder

NewDecoder new

func (*Decoder) Decode

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

Decode object

func (*Decoder) ReadData

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

ReadData read object

func (*Decoder) ReadFrom

func (d *Decoder) ReadFrom(reader ByteRuneReader) (interface{}, error)

ReadFrom read object from target reader

func (*Decoder) ReadLenTagObject

func (d *Decoder) ReadLenTagObject(tag byte) (interface{}, error)

ReadLenTagObject read length tag object

func (*Decoder) ReadList

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

ReadList read list

func (*Decoder) ReadObject

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

ReadObject read new object from reader

func (*Decoder) RegisterType

func (d *Decoder) RegisterType(key string, value reflect.Type)

RegisterType register key/value type

func (*Decoder) RegisterTypeMap

func (d *Decoder) RegisterTypeMap(mp map[string]reflect.Type)

RegisterTypeMap register map

func (*Decoder) RegisterVal

func (d *Decoder) RegisterVal(key string, val interface{})

RegisterVal register from value

func (*Decoder) Reset

func (d *Decoder) Reset(r ByteRuneReader)

Reset reset

func (*Decoder) ToObject added in v1.0.1

func (d *Decoder) ToObject(bts []byte) (interface{}, error)

ToObject decode bytes to object

type Encoder

type Encoder struct {
	// contains filtered or unexported fields
}

Encoder type

func NewEncoder

func NewEncoder(w io.Writer, np map[string]string) *Encoder

NewEncoder new

func (*Encoder) RegisterNameMap

func (e *Encoder) RegisterNameMap(mp map[string]string)

RegisterNameMap register name map

func (*Encoder) RegisterNameType

func (e *Encoder) RegisterNameType(key string, objectName string)

RegisterNameType register name type

func (*Encoder) Reset

func (e *Encoder) Reset(w io.Writer)

Reset reset

func (*Encoder) ToBytes added in v1.0.1

func (e *Encoder) ToBytes(object interface{}) ([]byte, error)

ToBytes encode object to bytes

func (*Encoder) WriteData

func (e *Encoder) WriteData(data interface{}) (int, error)

WriteData write object

func (*Encoder) WriteObject

func (e *Encoder) WriteObject(data interface{}) error

WriteObject write object

func (*Encoder) WriteTo

func (e *Encoder) WriteTo(w io.Writer, data interface{}) error

WriteTo write object to target writer

type Pool

type Pool interface {
	Get() interface{}
	Return(interface{})
}

func NewDecoderPool

func NewDecoderPool(size int, typeMap map[string]reflect.Type) Pool

NewDecoderPool new pool for decoder

func NewEncoderPool

func NewEncoderPool(size int, nameMap map[string]string) Pool

NewEncoderPool new pool for encoder

func NewSerializerPool

func NewSerializerPool(size int, typeMap map[string]reflect.Type, nameMap map[string]string) Pool

NewSerializerPool new pool for serializer

type Serializer

type Serializer interface {
	WriteTo(w io.Writer, object interface{}) error
	Write(object interface{}) error
	ToBytes(interface{}) ([]byte, error)

	ReadFrom(reader ByteRuneReader) (interface{}, error)
	Read() (interface{}, error)
	ToObject([]byte) (interface{}, error)
}

Serializer a api composite of encoder and decoder

func NewSerializer

func NewSerializer(typMap map[string]reflect.Type, nameMap map[string]string) Serializer

NewSerializer init

type ValueExtractor

type ValueExtractor func(v reflect.Value) bool

ValueExtractor extract info from struct value return true to continue extracting process return false to return current extracting process

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL