Skip to content
Choose a tag to compare

Protocol Buffers v3.3.0

Choose a tag to compare

Planned Future Changes

  • There are some changes that are not included in this release but are planned for the near future:
    • Preserve unknown fields in proto3: please read this doc for the timeline and follow up this github issue for discussion.
    • Make C++ implementation C++11 only: we plan to require C++11 to build protobuf code starting from 3.4.0 or 3.5.0 release. Please join this github issue to provide your feedback.


  • Fixed map fields serialization of DynamicMessage to correctly serialize both key and value regardless of their presence.
  • Parser now rejects field number 0 correctly.
  • New API Message::SpaceUsedLong() that’s equivalent to Message::SpaceUsed() but returns the value in size_t.
  • JSON support
    • New flag always_print_enums_as_ints in JsonPrintOptions.
    • New flag preserve_proto_field_names in JsonPrintOptions. It will instruct the JSON printer to use the original field name declared in the .proto file instead of converting them to lowerCamelCase when printing JSON.
    • JsonPrintOptions.always_print_primtive_fields now works for oneof message fields.
    • Fixed a bug that doesn’t allow different fields to set the same json_name value.
    • Fixed a performance bug that causes excessive memory copy when printing large messages.
  • Various performance optimizations.


  • Map field setters eagerly validate inputs and throw NullPointerExceptions as appropriate.
  • Added ByteBuffer overloads to the generated parsing methods and the Parser interface.
  • proto3 enum's getNumber() method now throws on UNRECOGNIZED values.
  • Output of JsonFormat is now locale independent.


  • Added FindServiceByName() in the pure-Python DescriptorPool. This works only for descriptors added with DescriptorPool.Add(). Generated descriptor_pool does not support this yet.
  • Added a descriptor_pool parameter for parsing Any in text_format.Parse().
  • descriptor_pool.FindFileContainingSymbol() now is able to find nested extensions.
  • Extending empty [] to repeated field now sets parent message presence.


  • Added file option php_class_prefix. The prefix will be prepended to all generated classes defined in the file.
  • When encoding, negative int32 values are sign-extended to int64.
  • Repeated/Map field setter accepts a regular PHP array. Type checking is done on the array elements.
  • encode/decode are renamed to serializeToString/mergeFromString.
  • Added mergeFrom, clear method on Message.
  • Fixed a bug that oneof accessor didn’t return the field name that is actually set.
  • C extension now works with php7.
  • This is the first GA release of PHP. We guarantee that old generated code can always work with new runtime and new generated code.


  • Fixed help for GPBTimestamp for dates before the epoch that contain fractional seconds.
  • Added GPBMessageDropUnknownFieldsRecursively() to remove unknowns from a message and any sub messages.
  • Addressed a threading race in extension registration/lookup.
  • Increased the max message parsing depth to 100 to match the other languages.
  • Removed some use of dispatch_once in favor of atomic compare/set since it needs to be heap based.
  • Fixes for new Xcode 8.3 warnings.


  • Fixed MapField.Values.CopyTo, which would throw an exception unnecessarily if provided exactly the right size of array to copy to.
  • Fixed enum JSON formatting when multiple names mapped to the same numeric value.
  • Added JSON formatting option to format enums as integers.
  • Modified RepeatedField to implement IReadOnlyList.
  • Introduced the start of custom option handling; it's not as pleasant as it might be, but the information is at least present. We expect to extend code generation to improve this in the future.
  • Introduced ByteString.FromStream and ByteString.FromStreamAsync to efficiently create a ByteString from a stream.
  • Added whole-message deprecation, which decorates the class with [Obsolete].


  • Fixed Message#to_h for messages with map fields.
  • Fixed memcpy() in binary gems to work for old glibc, without breaking the build for non-glibc libc’s like musl.


  • Added compatibility tests for version 3.0.0.
  • Added conformance tests.
  • Fixed serialization of extensions: we need to emit a value even if it is falsy (like the number 0).
  • Use in favor of for compiling JavaScript.