Как передать протокольный двоичный файл непосредственно в вызове gRP C? - PullRequest
0 голосов
/ 03 марта 2020

У меня уже есть прототип двоичного объекта сообщения protobuf.

Прямо сейчас, чтобы сделать вызов gRP C, мне нужно его разархивировать и отправить через объект сообщения клиенту gRP C (который снова будет маршалировать тот же объект), в процессе затрачивается время ожидания.

Как мне избежать этого, передав двоичный файл клиенту?

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Это возможно с помощью пользовательского кода c. Пользовательский код c может быть определен как

type StubbedCodec struct{}

func (cb StubbedCodec) Marshal(v interface{}) ([]byte, error) {
    return v.([]byte), nil
}

func (cb StubbedCodec) Unmarshal(data []byte, v interface{}) error {
    ba, _ := v.([]byte)

    for index, byte := range data {
        ba[index] = byte
    }
    return nil
}

Получив его, мы можем передать код c в качестве опции набора как

grpc.Dial(grpcServer, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDefaultCallOptions(grpc.ForceCodec(StubbedCodec{})))

Это заставит grp c для использования вашего кода c, который в основном ничего не делает (как определено выше).

0 голосов
/ 03 марта 2020

Если вы хотите отправить необработанные двоичные данные, используйте тип protobuf bytes например,

// .proto file
message MyRawData {
  bytes rawbin = 1;
}

. Это переведет в go байтовый фрагмент, идеально подходящий для хранения raw-двоичного файла:

// go-code
type MyRawData struct {   
    Rawbin []byte   `protobuf:"bytes,1,opt,name=rawbin,proto3" json:"rawbin,omitempty"`
}
...