GPB를 사용하면 래퍼 클래스가 의도하지 않은 이진 메시지 수락을 중지하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1681263

  •  16-09-2019
  •  | 
  •  

문제

사용 중입니다 Google 프로토콜 버퍼 내 비즈니스 객체 중 일부 (Java 앱)를 직렬화합니다. 튜토리얼에서 권장 된 바와 같이, 나는 메시지 빌더를 내 자신의 클래스로 랩핑하여 Getter 및 Setter 메소드를 구현하여 메시지 속성에 액세스합니다. 또한 모든 메시지 필드를 선언했습니다 optional, 다시 추천에 따라.

이제 래퍼 클래스에 인코딩 된 메시지를 줄 수 있으며 항상 구문 분석하고 수락합니다. 이것은 실제로 포함하지 않는 메시지 유형을 나타내는 래퍼 객체로 이어지고 많은 가짜가 발생합니다.

메시지의 이진 내용을 래퍼 클래스에로드 할 때 잘못된 유형을 통과 한 경우 오류를 어떻게 던지게 할 수 있습니까?

현재 생각하고있는 솔루션은 모든 메시지가 필요한 유형 필드 (및 버전 필드)를 사용하여 기본 메시지를 확장하도록합니다. 이것은 생성 된 빌더 클래스가 해당 필드가 누락 된 경우 예외를 던지고, 거기에 있으면 내 코드를 확인할 수 있습니다. 그러나, 나는 이것이 내 코드에 어떤 영향을 미치는지 평가하지 않았으며, 이것이 쉬운 일이지 확신하지 못한다.

도움이 되었습니까?

해결책 2

이것은 다른 사람들도하는 일인 것 같습니다. 그것은 나에게 잘 작동합니다.

message TypedMessage {
    required string type = 1;
    required bytes payload = 2;
}

실제 메시지는 직렬화 된 양식으로 페이로드 필드로 들어가고 유형은 적절한 빌더 및 래퍼 클래스를 얻는 데 사용됩니다. 이 필드는 또한 열거 일 수 있습니다. 저는 현재 Java 클래스 이름을 사용하고 있습니다. 이는 나중에 다른 시스템으로 대체 할 수 있습니다. 이는 파서의 재교육이 뒤집어지는 것을 의미하기 때문입니다.

다른 팁

MyMessage.parsefrom ()에 전달되는 데이터가 해당 유형의 메시지를 나타내지 않으면 유효한 프로토콜 버프 레스크를 얻을 수 있습니다. 당신에게 충분하지 않습니까?

PB 메시지는 자체 설명이 아니므로 어떤 메시지를 구문 분석하려고하는지 알아야합니다. 물론, 당신은 그것들을 구문 분석하고 유효하지 않은 프로 콜로 콜버 렉스 픽스를 잡을 수 있지만, 그것은 그리 좋지 않습니다. 대신, 대부분의 사람들은 당신이 설명하는 접근 방식을 사용하고 있다고 생각합니다. 유형 필드 (일반적으로 열거)와 여러 가지 옵션 필드가있는 기본 메시지 클래스를 사용하여 가능한 하위 유형마다 하나씩 사용합니다. 이를 통해 메시지를 구문 분석 한 다음 메시지 유형을 켜서 메시지의 실제 "페이로드"를 추출 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top