diff --git a/map.go b/map.go index f005324e..b360c9e4 100644 --- a/map.go +++ b/map.go @@ -219,7 +219,16 @@ func (d *Decoder) decMapByValue(value reflect.Value) error { return perrors.WithStack(err) } - m.Elem().SetMapIndex(EnsurePackValue(entryKey), EnsureRawValue(entryValue)) + // add a layer of conversion to make the map compatible with more types during decoding + key := EnsurePackValue(entryKey) + if mKey := m.Elem().Type().Key(); key.Type().ConvertibleTo(mKey) { + key = key.Convert(mKey) + } + val := EnsureRawValue(entryValue) + if mVal := m.Elem().Type().Elem(); val.Type().ConvertibleTo(mVal) { + val = val.Convert(mVal) + } + m.Elem().SetMapIndex(key, val) } SetValue(value, m) diff --git a/map_test.go b/map_test.go index 4d79ecd1..f86b8b64 100644 --- a/map_test.go +++ b/map_test.go @@ -18,6 +18,7 @@ package hessian import ( + "reflect" "testing" ) @@ -182,3 +183,46 @@ func TestJavaMap(t *testing.T) { RegisterPOJO(customMap) testJavaDecode(t, "customArgTypedFixed_CustomMap", customMap) } + +type Obj struct { + Map8 map[int8]int8 + Map16 map[int16]int16 + Map32 map[int32]int32 +} + +func (Obj) JavaClassName() string { + return "" +} + +func TestMapInObject(t *testing.T) { + var ( + req *Obj + e *Encoder + d *Decoder + err error + res interface{} + ) + + req = &Obj{ + Map8: map[int8]int8{1: 2, 3: 4}, + Map16: map[int16]int16{1: 2, 3: 4}, + Map32: map[int32]int32{1: 2, 3: 4}, + } + + e = NewEncoder() + e.Encode(req) + if len(e.Buffer()) == 0 { + t.Fail() + } + + d = NewDecoder(e.Buffer()) + res, err = d.Decode() + if err != nil { + t.Errorf("Decode() = %+v", err) + } + t.Logf("decode(%v) = %v, %v\n", req, res, err) + + if !reflect.DeepEqual(req, res) { + t.Fatalf("req: %#v != res: %#v", req, res) + } +}