首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >任何解元帅

任何解元帅
EN

Stack Overflow用户
提问于 2022-08-17 08:29:04
回答 1查看 523关注 0票数 0

我使用任何类型的proto。

代码语言:javascript
运行
复制
message Document {
    DocumentMeta meta = 1;
    bytes data = 2;
    google.protobuf.Any details = 3;
}

在客户机上,我创建了一个名为Dog的消息,并创建了details字段,如下所示:

代码语言:javascript
运行
复制
dog1 := events2.Dog{
    Name: "Leo",
    Id:   1,
}
var dst anypb.Any
err = anypb.MarshalFrom(&dst, &dog1, proto.MarshalOptions{})

还在服务器中复制包含Dog proto的.pb文件。

如果我在服务器中打印文档,它会给出正确的信息

代码语言:javascript
运行
复制
Any:type_url:"type.googleapis.com/com.test.eventbus.pb.events.Dog" value:"\n\x03Leo\x10\x01"

在服务器端,我在不提供特定的proto.Message类型(Dog)的情况下解除编组。

代码语言:javascript
运行
复制
basicDog, err := anypb.UnmarshalNew(doc.GetDetails(), proto.UnmarshalOptions{})

UnmarshalNew与proto: not found一起失败

  1. I在解编组过程中不提供特定类型,因为客户端可以发送在应用程序启动时可能没有定义的任何类型的消息。
  2. 因此客户端生成一个新的proto文件,生成用于go的.pb,并在服务器中复制这个.go文件。

如何在服务器端使用.pb文件,同时使用unmarshalAny()方法?

EN

回答 1

Stack Overflow用户

发布于 2022-08-18 02:39:45

试着使用google.protobuf.Value

原始文件:

代码语言:javascript
运行
复制
syntax = "proto3";

package mediation.common;

option go_package = ".;common";

import "google/protobuf/struct.proto";

message Model {
  google.protobuf.Value any = 2;
}

使用:

代码语言:javascript
运行
复制
package common

import (
    "encoding/json"
    "testing"

    "google.golang.org/protobuf/types/known/structpb"
)

type Dog struct {
    Id   int
    Name string
}

func TestAny(t *testing.T) {
    data := map[string]interface{}{
        "id":   1,
        "name": "kitty",
    }

    s, _ := structpb.NewValue(data)
    newData := s.GetStructValue()

    m := Model{Any: structpb.NewStructValue(newData)}

    var dog Dog
    unmarshal(m.GetAny(), &dog)
    t.Log(dog)

    var mm map[string]interface{}
    unmarshal(m.GetAny(), &mm)
    t.Log(mm)
}

func unmarshal(p *structpb.Value, o interface{}) error {
    byt, _ := p.MarshalJSON()
    return json.Unmarshal(byt, o)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73385231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档