2017-12-12 3 views
1

파일 형식으로 Protobuf3을 사용하고 있습니다. PB API는 직렬화 및 직렬화 해제에 매우 효과적입니다. 그러나 이제는 왕복 여행을 원합니다. 파일을 쓰고, 다시 읽고, 한 필드를 수정하고, 다시 파일을 저장소에 다시 작성합니다.Protobuf : 파일을 다시 쓰는 방법

자세한 내용 : PB 객체를 만들 때 먼저 Builder 객체를 인스턴스화하고 객체에 필드 값을 설정 한 다음 이진 객체를 작성합니다. 그러나 이진 객체를 작성하고 다시 읽은 후 필드를 어떻게 수정합니까? 하나는 Builder 객체를 사용하여 바이너리를 생성해야하지만 기존의 모든 필드를 빌더로 다시 복사해야합니까? 또는 Builder가 바이너리 형식에서 자동으로 채워지 는가?

이상적으로는 바이너리를로드하고 새로운 빌더를 만들고 원하는 필드를 설정하여 원래 데이터와 새 데이터를 병합 할 수 있습니다.

모범 사례는 무엇입니까?

+0

API는 플랫폼과 언어에 따라 다를 수 있습니다. 당신이 사용하고있는 것을 정확하게 지정할 수 있습니까? 예를 들어 자바에서 구현 된 Google 애플리케이션입니까? –

+0

자바와 파이썬 모두. – Hephaestus

+0

그리고 예, 우리는 Google ProtoBuf 구현을 사용하고 있습니다. 그것의 아주 인상적인 도구. – Hephaestus

답변

1

deserialise 할 때 필드가 설정된 개체가 최종 설정됩니다. 이 필드는 원하는대로 수정할 수 있습니다. 그런 다음 해당 객체를 직렬화하고 새 바이트 스트림을 파일에 쓸 수 있습니다.

역 직렬화 된 객체의 복사본을 만들 필요가 없습니다 (GPB 구현에는 일반적으로 복사본을 만들려면 복사본 생성자가 있습니다).

수행 할 수없는 작업은 파일을 편집하는 것입니다. 파일을 완전히 다시 작성해야합니다. 바이트 스트림의 어떤 부분이 변경되었는지 알 수있는 분별있는 방법이 없습니다. 객체가 길어지고 짧아 졌을 수 있으며 객체의 필드를 변경했기 때문에 내용 자체가 다른 경우가 있습니다.

+1

약간의주의 사항 : * 루트 메시지 *를 편집하는 동안 다시 쓰지 않고도 특정 변경을 할 수 있으며'반복 /'지도 '등에 새 하위 메시지를 추가하거나 업데이트 중입니다 프리미티브의 가치 - 이러한 경우 * 당신은 protobuf –

+0

@MarcGravell의 덧셈 === 병합 의미론을 사용할 수 있습니다, 그렇습니다.하지만 나는 그 것을 나중에 떠날 것이라고 생각했습니다! – bazza

+0

좋아요. 필자는 필드를 업데이트 한 후 전체 이진 쓰기를 계획하고있었습니다. 그래서 문제 없습니다. 감사! – Hephaestus

관련 문제