>  기사  >  백엔드 개발  >  이를 포함하는 메시지를 마샬링할 때 기존 protobuf 바이너리를 재사용할 수 있나요? (프로토부프3)

이를 포함하는 메시지를 마샬링할 때 기존 protobuf 바이너리를 재사용할 수 있나요? (프로토부프3)

WBOY
WBOY앞으로
2024-02-06 10:30:11493검색

在编组包含它的消息时,我可以重用现有的 protobuf 二进制文件吗?(protobuf3)

질문 내용

protobuf는 다음과 같이 정의됩니다.

으아아아

어떤 경우에는 protobuf 정의를 변경하지 않고 누군가로부터 hugemes​​sage,我想用其他字段打包它,然后将该消息传输给其他人。因此,我必须将 hugemes​​sage 二进制文件unmarshal放入go结构中,将其打包到request中,然后再次marshal。由于 hugemes​​sage 的 hgue 大小,unmarshalmarshal 的成本难以承受。那么我可以重用 hugemes​​sage 바이너리를 받았습니다.

syntax = "proto3"

message hugemessage {
    // omitted
}

message request {
    string name = 1;
    hugemessage payload = 2;
}

정답


짧은 대답은 다음과 같습니다. 아니요. 이를 달성하는 쉽거나 표준적인 방법은 없습니다.

가장 확실한 전략은 현재 수행하는 방식으로 수행하는 것입니다. 즉, 비정렬화hugemes​​sage,将其设置为 request를 한 다음 다시 마샬링하는 것입니다. Golang protobuf API 표면은 실제로 더 많은 작업을 수행할 수 있는 방법을 제공하지 않으며 그럴 만한 이유가 있습니다.

하지만 원하는 것을 달성하는 방법에는 가지가 있습니다. 그러나 이것이 반드시 안전하거나 신뢰할 수 있는 것은 아니므로 현재 가지고 있는 비용과 비교하여 그 비용을 평가해야 합니다.

정렬 해제를 방지하는 한 가지 방법은 메시지가 일반적으로 직렬화되는 방식을 활용하는 것입니다. 으아아아

..

와 동일 으아아아

..

가 결과입니다. payload 包含针对某些 hugemes​​sage 调用 marshal(...)

따라서 다음과 같은 정의가 있다고 가정해 보겠습니다.

으아아아

다음 코드:

으아아아

출력

equal? true

이 "특이한 기능"이 완전히 신뢰할 수 있는지 여부는 확실하지 않으며 계속해서 무기한으로 작동한다는 보장도 없습니다. 분명히

유형은 이상적이지 않습니다. rawrequest 类型必须完全镜像 request

또 다른 옵션은 보다 수동적인 방식으로 메시지를 작성하는 것입니다. 즉,

protowire 패키지를 사용하는 것입니다. 다시 한 번 말씀드리지만, 주의가 필요합니다.

위 내용은 이를 포함하는 메시지를 마샬링할 때 기존 protobuf 바이너리를 재사용할 수 있나요? (프로토부프3)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제