Dubbo/Dubbo-go中json 序列化工具有的会反射调用类的 get 方法?你的类里嵌了 pb ?pb 生成的类为啥要用 fastjson 序列化,看看栈的最底层是哪调用的,现在不确定这是哪个接口,好像是某个接口的异常,传递到别的接口了 只有一个这个warn.但是这个接口里面参数里面是没有 CreateImTeamForSpaceReq这个类,这个类是另一个triple接口pb生成的,warn的这个接口是dubbo协议的,他俩完全没有关系?这个问题找到了。。是我们的协议配置了打印accesslog,AccessLogFilter 使用了fastjson来转化参数导致的?
这个类就是pb生成的,不知道啊。。突然出现这个bug。就是运行一阵就出这个bug,而且java那边没有出现这个异常,你看看是不是特定接口出的 我们以前遇到过实体bean里套了list bean 触发过死循环,此回答整理自钉群“dubbogo社区1”
Dubbo/Dubbo-go 中提供了 json.Marshaler
和 json.Unmarshaler
两个接口,用于序列化和反序列化 JSON 对象。其中 json.Marshaler
可以实现 json.MarshalerJSON
接口,用于将 Go 类型转换为 JSON 字符串,而 json.Unmarshaler
可以实现 json.UnmarshalerJSON
接口,用于将 JSON 字符串转换为 Go 类型。
在 Dubbo/Dubbo-go 中,可以使用 json.MarshalerJSON
接口来实现反射调用类的 get
方法。具体来说,可以定义一个自定义的 JSONStringer
实现类,该类继承自 json.MarshalerJSON
,并重写其中的 MarshalJSON()
方法,在该方法中使用反射调用目标类的 get
方法获取属性值,并将其转换为 JSON 格式的字符串。
例如,假设我们有以下类结构:
type Person struct {
Name string
Age int
}
我们可以使用以下代码将该类序列化为 JSON 字符串:
type JSONStringer struct{}
func (j *JSONStringer) MarshalJSON() ([]byte, error) {
p := &Person{}
vals := structs.Map(p) // 通过反射获取属性值
b, err := json.Marshal(&vals)
if err != nil {
return nil, err
}
return b, nil
}
在服务提供者中注册该序列化器:
jsonProtocol := "json"
jsonMarshallers[jsonProtocol] = jsonStringer{}
然后在消费者中调用该协议时,就可以自动使用该序列化器进行通信了:
client := protocolFactory.GetProtocol(newClientConfig(url.URL{Scheme: "dubbo", Host: "localhost", Path: "/userService"}, jsonProtocol)).(protobuf.Client)
resp, err := client.Invoke("getUserById", req, newContext(timeoutMs))
if err != nil {
fmt.Println(err)
} else {
fmt.Println(resp.GetResult())
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。