>  기사  >  백엔드 개발  >  Go에서 알 수 없는 프로토콜 버퍼를 비정렬화하는 방법은 무엇입니까?

Go에서 알 수 없는 프로토콜 버퍼를 비정렬화하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-23 08:45:15726검색

How to Unmarshal Unknown Protocol Buffers in Go?

Go에서 알 수 없는 프로토콜 버퍼 언마샬링

프로토콜 버퍼(protobuf)로 작업할 때 수신된 메시지 유형이 다음과 같은 상황에 직면할 수 있습니다. 알려지지 않았습니다. 이는 여러 소스에서 메시지를 수신할 때 또는 동적이거나 예측할 수 없는 메시지 유형을 처리할 때 발생할 수 있습니다.

Protobuf의 기본 Unmarshal 함수는 특정 메시지 유형을 인수로 전달해야 하지만 메시지가 유형을 알 수 없습니다. 일반적인 접근 방식은 인터페이스로 역마샬링을 시도하는 것입니다{}. 그러나 이는 Protobuf 라이브러리에서 지원되지 않습니다.

제한 사항 해결

알 수 없는 메시지를 처리하려면, 사용자 정의 접근 방식을 구현해야 합니다. 한 가지 해결책은 protobuf 메시지의 와이어 표현에 대한 낮은 수준의 액세스를 제공하는 protowire 패키지를 사용하는 것입니다.

알 수 없는 메시지 구문 분석

다음 코드 조각은 방법을 보여줍니다. 알 수 없는 protobuf 메시지에서 정보를 구문 분석하고 추출하려면:

type Field struct {
    Tag
    Val
}

type Tag struct {
    Num int32
    Type protowire.Type
}

type Val struct {
    Payload interface{}
    Length int
}

func parseUnknown(b []byte) []Field {
    // ...
}

parseUnknown 함수 바이트 배열을 반복하여 필드를 소비하고 각 필드의 태그 및 값에 대한 기본 정보를 추출합니다.

페이로드 추출

추출된 값 페이로드는 다양한 형태로 저장될 수 있습니다. 필드의 예상 유형과 내용에 따른 데이터 구조. 예:

switch t {
case protowire.VarintType:
    v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen])
case protowire.Fixed64Type:
    v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen])
// ...
}

제한 사항 및 고려 사항

이 접근 방식에는 특정 제한 사항이 있습니다.

  • 모호함: protobuf 메시지의 연결 표현은 모호할 수 있으므로 정확한 유형을 결정하기가 어렵습니다. 경우에 따라 값이 지정됩니다.
  • 알 수 없는 필드: 알 수 없거나 지원되지 않는 필드 유형은 구문 분석되거나 보존되지 않습니다.
  • 하위 메시지: Sub - 메시지는 재귀적으로 구문 분석되지만 유형 정보는 다음과 같습니다. 손실되었습니다.
  • 반복 필드: 반복 필드는 명시적으로 처리되지 않습니다.

알 수 없는 메시지 구문 분석의 대안

대부분의 시나리오에서는 알 수 없는 메시지 문제에 대해 다음과 같은 다른 관점에서 접근하는 것이 좋습니다. as:

  • 일반 메시지에 매핑: 가능한 모든 필드를 캡슐화할 수 있는 일반 메시지 유형을 생성하고 알 수 없는 메시지를 이 일반 유형에 매핑합니다.
  • Any Proto 사용: 알 수 없는 메시지를 캡슐화하고 나중에 사용할 수 있도록 유형 정보를 보존하려면 Any proto 유형을 사용하는 것이 좋습니다.

이 문서에 설명된 접근 방식은 알 수 없는 protobuf 메시지에서 기본 정보를 추출하는 방법을 제공하지만, 다른 옵션을 사용할 수 없는 경우 대체 솔루션으로 사용해야 합니다.

위 내용은 Go에서 알 수 없는 프로토콜 버퍼를 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.