Skip to content

Protocol Buffers v3.0.0-alpha-3

Pre-release
Pre-release
Compare
Choose a tag to compare
@TeBoring TeBoring released this 29 May 17:43

Version 3.0.0-alpha-3 (C++/Java/Python/Ruby/JavaNano/Objective-C/C#)

General

  • Introduced two new language implementations (Objective-C, C#) to proto3.

  • Explicit "optional" keyword are disallowed in proto3 syntax, as fields are
    optional by default.

  • Group fields are no longer supported in proto3 syntax.

  • Changed repeated primitive fields to use packed serialization by default in
    proto3 (implemented for C++, Java, Python in this release). The user can
    still disable packed serialization by setting packed to false for now.

  • Added well-known type protos (any.proto, empty.proto, timestamp.proto,
    duration.proto, etc.). Users can import and use these protos just like
    regular proto files. Addtional runtime support will be added for them in
    future releases (in the form of utility helper functions, or having them
    replaced by language specific types in generated code).

  • Added a "reserved" keyword in both proto2 and proto3 syntax. User can use
    this keyword to declare reserved field numbers and names to prevent them
    from being reused by other fields in the same message.

    To reserve field numbers, add a reserved declaration in your message:

    message TestMessage {
      reserved 2, 15, 9 to 11, 3;
    }
    

    This reserves field numbers 2, 3, 9, 10, 11 and 15. If a user uses any of
    these as field numbers, the protocol buffer compiler will report an error.

    Field names can also be reserved:

    message TestMessage {
      reserved "foo", "bar";
    }
    
  • Various bug fixes since 3.0.0-alpha-2

Objective-C

  • Objective-C includes a code generator and a native objective-c runtime
    library. By adding “--objc_out” to protoc, the code generator will generate
    a header(.pbobjc.h) and an implementation file(.pbobjc.m) for each proto
    file.

    In this first release, the generated interface provides: enums, messages,
    field support(single, repeated, map, oneof), proto2 and proto3 syntax
    support, parsing and serialization. It’s compatible with ARC and non-ARC
    usage. Besides, user can also access it via the swift bridging header.

    See objectivec/README.md for details.

C#

  • C# protobufs are based on project
    https://github.com/jskeet/protobuf-csharp-port. The original project was
    frozen and all the new development will happen here.

  • Codegen plugin for C# was completely rewritten to C++ and is now an
    intergral part of protoc.

  • Some refactorings and cleanup has been applied to the C# runtime library.

  • Only proto2 is supported in C# at the moment, proto3 support is in
    progress and will likely bring significant breaking changes to the API.

    See csharp/README.md for details.

C++

  • Added runtime support for Any type. To use Any in your proto file, first
    import the definition of Any:

    // foo.proto
    import "google/protobuf/any.proto";
    message Foo {
      google.protobuf.Any any_field = 1;
    }
    message Bar {
      int32 value = 1;
    }
    

    Then in C++ you can access the Any field using PackFrom()/UnpackTo()
    methods:

    Foo foo;
    Bar bar = ...;
    foo.mutable_any_field()->PackFrom(bar);
    ...
    if (foo.any_field().IsType<Bar>()) {
      foo.any_field().UnpackTo(&bar);
      ...
    }
    
  • In text format, entries of a map field will be sorted by key.

Java

  • Continued optimizations on the lite runtime to improve performance for
    Android.

Python

  • Added map support.
    • maps now have a dict-like interface (msg.map_field[key] = value)
    • existing code that modifies maps via the repeated field interface
      will need to be updated.

Ruby

  • Improvements to RepeatedField's emulation of the Ruby Array API.
  • Various speedups and internal cleanups.