commit | 548cd26eca1aa735e550962be2f585df81bcdd8c | [log] [tgz] |
---|---|---|
author | Xin.Zh <dragoncharlie@foxmail.com> | Fri Sep 20 21:15:51 2019 +0800 |
committer | GitHub <noreply@github.com> | Fri Sep 20 21:15:51 2019 +0800 |
tree | 9244cb37ccd5b49464e5f9bf0986573f0fa73f0f | |
parent | 80cbb25cbb227c0cf5e3d0ef186b207534646148 [diff] | |
parent | 56091907ef7023c5fefbe7a116dc7a43269e0985 [diff] |
Merge pull request #131 from wongoo/feature-emoji fix emoji encode error
It's a golang hessian library used by Apache/dubbo-go.
type Circular struct {
Num int
Previous *Circular
Next *Circular
}
func (Circular) JavaClassName() string {
return "com.company.Circular"
}
c := &Circular{}
c.Num = 12345
c.Previous = c
c.Next = c
e := NewEncoder()
err := e.Encode(c)
if err != nil {
panic(err)
}
bytes := e.Buffer()
decodedObject, err := NewDecoder(bytes).Decode() if err != nil { panic(err) } circular, ok := obj.(*Circular) // ...
Hessian encoder default converts filed names of struct to lower camelcase, but you can customize it using hessian
tag.
Example:
type MyUser struct { UserFullName string `hessian:"user_full_name"` FamilyPhoneNumber string // default convert to => familyPhoneNumber } func (MyUser) JavaClassName() string { return "com.company.myuser" } user := &MyUser{ UserFullName: "username", FamilyPhoneNumber: "010-12345678", } e := hessian.NewEncoder() err := e.Encode(user) if err != nil { panic(err) }
The encoded bytes of the struct MyUser
is as following:
00000000 43 12 63 6f 6d 2e 63 6f 6d 70 61 6e 79 2e 6d 79 |C.com.company.my| 00000010 75 73 65 72 92 0e 75 73 65 72 5f 66 75 6c 6c 5f |user..user_full_| 00000020 6e 61 6d 65 11 66 61 6d 69 6c 79 50 68 6f 6e 65 |name.familyPhone| 00000030 4e 75 6d 62 65 72 60 08 75 73 65 72 6e 61 6d 65 |Number`.username| 00000040 0c 30 31 30 2d 31 32 33 34 35 36 37 38 |.010-12345678|
Hessian decoder finds the correct target field though comparing all filed names of struct one by one until matching.
The following example shows the order of the matching rules:
type MyUser struct { MobilePhone string `hessian:"mobile-phone"` } // You must define the tag of struct for lookup filed form encoded binary bytes, in this caseļ¼ // 00000000 43 12 63 6f 6d 2e 63 6f 6d 70 61 6e 79 2e 6d 79 |C.com.company.my| // 00000010 75 73 65 72 91 0c 6d 6f 62 69 6c 65 2d 70 68 6f |user..mobile-pho| // 00000020 6e 65 60 0b 31 37 36 31 32 33 34 31 32 33 34 |ne`.17612341234| // // mobile-phone(tag lookup) => mobilePhone(lowerCameCase) => MobilePhone(SameCase) => mobilephone(lowercase) // ^ will matched type MyUser struct { MobilePhone string } // The following encoded binary bytes will be hit automatically: // // 00000000 43 12 63 6f 6d 2e 63 6f 6d 70 61 6e 79 2e 6d 79 |C.com.company.my| // 00000010 75 73 65 72 91 0b 6d 6f 62 69 6c 65 50 68 6f 6e |user..mobilePhon| // 00000020 65 60 0b 31 37 36 31 32 33 34 31 32 33 34 |e`.17612341234| // // mobile-phone(tag lookup) => mobilePhone(lowerCameCase) => MobilePhone(SameCase) => mobilephone(lowercase) // ^ will matched // // 00000000 43 12 63 6f 6d 2e 63 6f 6d 70 61 6e 79 2e 6d 79 |C.com.company.my| // 00000010 75 73 65 72 91 0b 4d 6f 62 69 6c 65 50 68 6f 6e |user..MobilePhon| // 00000020 65 60 0b 31 37 36 31 32 33 34 31 32 33 34 |e`.17612341234| // // mobile-phone(tag lookup) => mobilePhone(lowerCameCase) => MobilePhone(SameCase) => mobilephone(lowercase) // ^ will matched // // 00000000 43 12 63 6f 6d 2e 63 6f 6d 70 61 6e 79 2e 6d 79 |C.com.company.my| // 00000010 75 73 65 72 91 0b 6d 6f 62 69 6c 65 70 68 6f 6e |user..mobilephon| // 00000020 65 60 0b 31 37 36 31 32 33 34 31 32 33 34 |e`.17612341234| // // mobile-phone(tag lookup) => mobilePhone(lowerCameCase) => MobilePhone(SameCase) => mobilephone(lowercase) // ^ will matched
You can use hessian.SetTagIdentifier
to customize tag-identifier of hessian, which takes effect to both encoder and decoder.
Example:
hessian.SetTagIdentifier("json") type MyUser struct { UserFullName string `json:"user_full_name"` FamilyPhoneNumber string // default convert to => familyPhoneNumber } func (MyUser) JavaClassName() string { return "com.company.myuser" } user := &MyUser{ UserFullName: "username", FamilyPhoneNumber: "010-12345678", } e := hessian.NewEncoder() err := e.Encode(user) if err != nil { panic(err) }
The encoded bytes of the struct MyUser
is as following:
00000000 43 12 63 6f 6d 2e 63 6f 6d 70 61 6e 79 2e 6d 79 |C.com.company.my| 00000010 75 73 65 72 92 0e 75 73 65 72 5f 66 75 6c 6c 5f |user..user_full_| 00000020 6e 61 6d 65 11 66 61 6d 69 6c 79 50 68 6f 6e 65 |name.familyPhone| 00000030 4e 75 6d 62 65 72 60 08 75 73 65 72 6e 61 6d 65 |Number`.username| 00000040 0c 30 31 30 2d 31 32 33 34 35 36 37 38 |.010-12345678|