开发者社区 > 云原生 > 正文

Dubbo/Dubbo-go中json 序列化工具有的会反射调用类的 get 方法?你的类里嵌了

Dubbo/Dubbo-go中json 序列化工具有的会反射调用类的 get 方法?你的类里嵌了 pb ?pb 生成的类为啥要用 fastjson 序列化,看看栈的最底层是哪调用的,现在不确定这是哪个接口,好像是某个接口的异常,传递到别的接口了image.png image.png 只有一个这个warn.但是这个接口里面参数里面是没有 CreateImTeamForSpaceReq这个类,这个类是另一个triple接口pb生成的,warn的这个接口是dubbo协议的,他俩完全没有关系?这个问题找到了。。是我们的协议配置了打印accesslog,AccessLogFilter 使用了fastjson来转化参数导致的?

展开
收起
真的很搞笑 2023-05-30 13:35:19 124 0
2 条回答
写回答
取消 提交回答
  • 这个类就是pb生成的,不知道啊。。突然出现这个bug。就是运行一阵就出这个bug,而且java那边没有出现这个异常,你看看是不是特定接口出的 我们以前遇到过实体bean里套了list bean 触发过死循环,此回答整理自钉群“dubbogo社区1”

    2023-05-30 13:55:15
    赞同 展开评论 打赏
  • CSDN全栈领域优质创作者,万粉博主;InfoQ签约博主;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

    Dubbo/Dubbo-go 中提供了 json.Marshalerjson.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())
    }
    
    2023-05-30 13:49:36
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Go语言路上踩过的坑 立即下载
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载