Protobuf Editions

Editions and the End of proto2/proto3 Syntax

protobuf 59,573 long had two dialects: proto2 (required and optional labels, explicit presence, closed enums) and proto3 (implicit presence, open enums). Editions replace both with one grammar, edition = "2023" or "2024", plus features set per file, message or field, and keep the binary, text and JSON encodings. The editions overview names 2024 the latest released edition; 2026 was announced for the 36.x line, and protoc 36.2 already compiles it. The edition 2024 copy of order.proto changes three lines: edition = "2024";, then option features.field_presence = IMPLICIT; for proto3's behavior, and string coupon = 8 [features.field_presence = EXPLICIT];, because protoc rejects optional in editions. hash.py serializes all 100,000 orders through a given build of order_pb2.py:

editions.sh: proto3 and edition 2024 builds, byte for byteShell
protoc -I editions --python_out=editions editions/order.proto
python hash.py . && python hash.py editions    # hash 100,000 orders through each build
Output
order_pb2.py           sha256 f1a795b55d53cde0c694fcda
editions/order_pb2.py  sha256 f1a795b55d53cde0c694fcda

Editions 2023 and 2024 default to proto3's behavior (open enums, packed repeated fields, UTF-8 validation) except field_presence, which defaults to EXPLICIT as in proto2. proto3 is not deprecated, and protoc compiles it unchanged; convert a file when you want per-field control or a feature only a newer edition offers.