This is an automated email from the ASF dual-hosted git repository.
wongoo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-go-hessian2.git
The following commit(s) were added to refs/heads/master by this push:
new 57240d6 convert pointer to encode (#289)
57240d6 is described below
commit 57240d6215bbf487b30cab2f6aa0bf351dc590c9
Author: binbin.zhang <[email protected]>
AuthorDate: Tue Nov 16 14:37:06 2021 +0800
convert pointer to encode (#289)
Co-authored-by: sanxun0325 <bbz17640380550.com>
---
codec.go | 7 +++++++
codec_test.go | 13 +++++++++++++
encode.go | 6 +++++-
encode_test.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
serialize.go | 4 ++--
5 files changed, 77 insertions(+), 3 deletions(-)
diff --git a/codec.go b/codec.go
index 5087efa..425468c 100644
--- a/codec.go
+++ b/codec.go
@@ -476,3 +476,10 @@ func ConvertSliceValueType(destTyp reflect.Type, v
reflect.Value) (reflect.Value
return sl, nil
}
+
+//PackPtrInterface pack struct interface to pointer interface
+func PackPtrInterface(s interface{}, value reflect.Value) interface{} {
+ vv := reflect.New(reflect.TypeOf(s))
+ vv.Elem().Set(value)
+ return vv.Interface()
+}
diff --git a/codec_test.go b/codec_test.go
index a4cdd1b..b2dd937 100644
--- a/codec_test.go
+++ b/codec_test.go
@@ -18,9 +18,14 @@
package hessian
import (
+ "reflect"
"testing"
)
+import (
+ "github.com/stretchr/testify/assert"
+)
+
// go test -v -run TestPackUint16
func TestPackUint16(t *testing.T) {
// var arr []byte
@@ -57,3 +62,11 @@ func TestPackInt64(t *testing.T) {
t.Fatalf("v:0X%d, pack-unpack value:0X%x\n", v, r)
}
}
+
+func TestPackPtrInterface(t *testing.T) {
+ v := "struct"
+ vv := reflect.ValueOf(v)
+ sPointer, ok := PackPtrInterface(v, vv).(*string)
+ assert.True(t, ok)
+ assert.True(t, *sPointer == "struct")
+}
diff --git a/encode.go b/encode.go
index c26832e..0daf3e0 100644
--- a/encode.go
+++ b/encode.go
@@ -160,7 +160,11 @@ func (e *Encoder) Encode(v interface{}) error {
switch t.Kind() {
case reflect.Struct:
vv := reflect.ValueOf(v)
- vv = UnpackPtr(vv)
+ if vv.Kind() != reflect.Ptr {
+ v = PackPtrInterface(v, vv)
+ } else {
+ vv = UnpackPtr(vv)
+ }
if !vv.IsValid() {
e.buffer = EncNull(e.buffer)
return nil
diff --git a/encode_test.go b/encode_test.go
index 543452f..6db3a98 100644
--- a/encode_test.go
+++ b/encode_test.go
@@ -87,3 +87,53 @@ func testSimpleEncode(t *testing.T, v interface{}) {
err := e.Encode(v)
assert.Nil(t, err)
}
+
+type BenchData struct {
+ name string
+}
+
+func (b *BenchData) JavaClassName() string {
+ return "test.bench.BenchData"
+}
+
+// Benchmark_Struct_Encode 2231869 506.8 ns/op
560 B/op 7 allocs/op
+func Benchmark_Struct_Encode(b *testing.B) {
+ b.ReportAllocs()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ NewEncoder().Encode(BenchData{})
+ }
+}
+
+// Benchmark_Pointer_Encode 2565778 476.1 ns/op
560 B/op 7 allocs/op
+func Benchmark_Pointer_Encode(b *testing.B) {
+ b.ReportAllocs()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ NewEncoder().Encode(&BenchData{})
+ }
+}
+
+// Benchmark_Struct_Encode_8 2307214 519.4 ns/op
560 B/op 7 allocs/op
+func Benchmark_Struct_Encode_8(b *testing.B) {
+ b.ReportAllocs()
+ b.ResetTimer()
+ b.SetParallelism(8)
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ NewEncoder().Encode(BenchData{})
+ }
+ })
+}
+
+// Benchmark_Pointer_Encode_8 2460842 476.7 ns/op
560 B/op 7 allocs/op
+func Benchmark_Pointer_Encode_8(b *testing.B) {
+ b.ReportAllocs()
+ b.ResetTimer()
+ b.SetParallelism(8)
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ NewEncoder().Encode(&BenchData{})
+ }
+ })
+}
diff --git a/serialize.go b/serialize.go
index b57702b..ca738ea 100644
--- a/serialize.go
+++ b/serialize.go
@@ -69,7 +69,7 @@ func (IntegerSerializer) DecObject(d *Decoder, typ
reflect.Type, cls *classInfo)
}
func (IntegerSerializer) EncObject(e *Encoder, v POJO) error {
- bigInt, ok := v.(bigInteger)
+ bigInt, ok := v.(*bigInteger)
if !ok {
return e.encObject(v)
}
@@ -80,7 +80,7 @@ func (IntegerSerializer) EncObject(e *Encoder, v POJO) error {
type DecimalSerializer struct{}
func (DecimalSerializer) EncObject(e *Encoder, v POJO) error {
- decimal, ok := v.(big.Decimal)
+ decimal, ok := v.(*big.Decimal)
if !ok {
return e.encObject(v)
}