结构体 - Reader

优质
小牛编辑
137浏览
2023-12-01

NewReader 构造函数

  1. func NewReader(buf []byte, simple bool) (reader *Reader)

buf 为反序列化数据的数据。

simple 如果为 true,则不使用引用方式反序列化,通常在反序列化的数据中不包含引用类型数据时,设置为 true 可以加快速度。当包含引用类型数据时,需要设置为 false(即默认值),否则会抛出异常。

Simple 字段

同上面的 simple 参数。

JSONCompatible 字段

反序列化数据时,如果反序列化的数据为 interface{} 的指针,而不是某个具体类型数据的指针,那幺将会按照默认类型序列化。下面是 hprose 类型与反序列化默认类型的对应关系表:

hprose 类型go 类型
Integerint
  1. Long | *big.Int

Double | float64Boolean | boolUTF8 char | stringNull | nilEmpty | ""DateTime | time.TimeBytes | []byteString | stringGUID | stringList | []interface{}Map | map[interface{}]interface{}Object | 结构体对象指针

我们会发现 Map 类型的默认映射类型是:map[interface{}]interface{},如果将 JSONCompatible 字段设置为 true,则 Map 类型的默认映射类型是:map[string]interface{},当你确认你的 Map 数据是 JSON 兼容的,即 map 的 key 一定是 string 类型或者可以转换为 string 类型的数据时,可以将该字段设置为 true

CheckTag 方法

  1. func (r *Reader) CheckTag(expectTag byte) (tag byte)

检查当前位置的字节是否为 expectTag,如果是返回该 tag 字节,否则 panic。

CheckTags 方法

  1. func (r *Reader) CheckTags(expectTags []byte) (tag byte)

检查当前位置的字节是否为 expectTags 之一,如果是返回该 tag 字节,否则 panic。

ReadBigIntWithoutTag 方法

  1. func (r *Reader) ReadBigIntWithoutTag() *big.Int

r 的当前位置读取数据并反序列化为一个 *big.Int 类型的数据。该方法假设序列化标记已被读取,并且其值为 TagLong

如果反序列化过程中发生错误,则 panic。

ReadBool 方法

  1. func (r *Reader) ReadBool() bool

r 的当前位置读取数据并反序列化为一个 bool 值。

如果反序列化过程中发生错误,则 panic。

ReadBytesWithoutTag 方法

  1. func (r *Reader) ReadBytesWithoutTag() (b []byte)

r 的当前位置读取数据并反序列化为 []byte 结果并返回。该方法假设序列化标记已被读取,并且其值为 TagBytes。

如果反序列化过程中发生错误,则 panic。

ReadComplex128 方法

  1. func (r *Reader) ReadComplex128() complex128

r 的当前位置读取数据并反序列化为一个 complex128 值。

如果反序列化过程中发生错误,则 panic。

ReadComplex64 方法

  1. func (r *Reader) ReadComplex64() complex64

r 的当前位置读取数据并反序列化为一个 complex64 值。

如果反序列化过程中发生错误,则 panic。

ReadCount 方法

  1. func (r *Reader) ReadCount() int

r 的当前位置读取数组,slice,map 或者结构体字段的数量。该方法假设序列化标记已被读取。该方法主要用于 RPC 实现,用户通常不需要直接使用该方法。

如果反序列化过程中发生错误,则 panic。

ReadDateTimeWithoutTag 方法

  1. func (r *Reader) ReadDateTimeWithoutTag() (dt time.Time)

r 的当前位置读取数据并反序列化为一个 time.Time 值。该方法假设序列化标记已被读取,并且其值为 TagDate

如果反序列化过程中发生错误,则 panic。

ReadFloat32 方法

  1. func (r *Reader) ReadFloat32() float32

r 的当前位置读取数据并反序列化为一个 float32 值。

如果反序列化过程中发生错误,则 panic。

ReadFloat64 方法

  1. func (r *Reader) ReadFloat64() float64

r 的当前位置读取数据并反序列化为一个 float64 值。

如果反序列化过程中发生错误,则 panic。

ReadInt 方法

  1. func (r *Reader) ReadInt() int64

r 的当前位置读取数据并反序列化为一个 int64 值。

如果反序列化过程中发生错误,则 panic。

ReadIntWithoutTag 方法

  1. func (r *Reader) ReadIntWithoutTag() int

r 的当前位置读取数据并反序列化为一个 int 值。该方法假设序列化标记已被读取,并且其值为 TagInteger

如果反序列化过程中发生错误,则 panic。

ReadSlice 方法

  1. func (r *Reader) ReadSlice(v []reflect.Value)

r 的当前位置读取数据并反序列化到 v 中。该方法假设序列化标记已被读取,并且其值为 TagList,且元素个数也已被读取,并且等于 v 的长度,反序列化时,每个元素按照 v 中每个元素的类型进行反序列化。该方法用于 RPC 实现,用户通常不需要使用该方法。

如果反序列化过程中发生错误,则 panic。

ReadSliceWithoutTag 方法

  1. func (r *Reader) ReadSliceWithoutTag() []reflect.Value

r 的当前位置读取数据并反序列化为一个 []reflect.Value 类型的数据。该方法假设序列化标记已被读取,并且其值为 TagList

如果反序列化过程中发生错误,则 panic。

ReadString 方法

  1. func (r *Reader) ReadString() (str string)

r 的当前位置读取数据并反序列化为一个 string 类型的数据。

如果反序列化过程中发生错误,则 panic。

ReadStringWithoutTag 方法

  1. func (r *Reader) ReadStringWithoutTag() (str string)

r 的当前位置读取数据并反序列化为一个 string 类型的数据。该方法假设序列化标记已被读取,并且其值为 TagString

如果反序列化过程中发生错误,则 panic。

ReadTime 方法

  1. func (r *Reader) ReadTime() (dt time.Time)

r 的当前位置读取数据并反序列化为一个 time.Time 类型的数据。

如果反序列化过程中发生错误,则 panic。

ReadTimeWithoutTag 方法

  1. func (r *Reader) ReadTimeWithoutTag() (t time.Time)

r 的当前位置读取数据并反序列化为一个 time.Time 类型的数据。该方法假设序列化标记已被读取,并且其值为 TagTime

如果反序列化过程中发生错误,则 panic。

ReadUint 方法

  1. func (r *Reader) ReadUint() uint64

r 的当前位置读取数据并反序列化为一个 uint64 类型的数据。

如果反序列化过程中发生错误,则 panic。

ReadValue 方法

  1. func (r *Reader) ReadValue(v reflect.Value)

r 的当前位置读取数据并反序列化到参数 v 中。反序列化的数据类型跟 v 中所包含的类型一致。

如果反序列化过程中发生错误,则 panic。

Reset 方法

  1. func (r *Reader) Reset()

将反序列化的引用计数器重置。

Unserialize 方法

  1. func (r *Reader) Unserialize(p interface{})

r 的当前位置读取数据并反序列化结果到 p 中,p 是一个指向结果的指针。

如果反序列化过程中发生错误,则 panic。