2025年6月27日に発表された変更点

2025年6月27日にProtocol Buffersに発表された変更点。

Edition 2024

Protobuf Editionsは2025年第3四半期に32.xでリリース予定です。

これらは実装が予想される変更点を説明していますが、ソフトウェアの柔軟な性質上、これらの変更点の一部は実装されないか、このトピックで説明されている内容と異なる場合があります。

Edition 2024のより詳しいドキュメントは、Edition 2023からの移行に関する情報を含め、エディションの機能設定で公開される予定です。

既存機能の変更点

このセクションでは、Edition 2024でデフォルト設定が変更される既存の機能について詳しく説明します。

C++ string_type

Edition 2023でリリースされたstring_type機能のデフォルト値は、Edition 2024でSTRINGからVIEWに変更されます。

この機能とその機能値に関する詳細は、features.(pb.cpp).string_typeおよびString View APIを参照してください。

新機能

このセクションでは、Edition 2024で導入される新機能について詳しく説明します。

enforce_naming_style

feature.enforce_naming_styleは、厳密な命名スタイル強制を可能にし、デフォルトでprotosがラウンドトリップ可能であることを保証します。機能値でレガシー命名スタイルを使用するようにオプトアウトできます。

default_symbol_visibility

この機能は、インポート可能なシンボル(メッセージや列挙型など)のデフォルトのシンボル可視性がどちらであるかを制御します。

  • export: importステートメントを介して他のprotoから参照可能
  • local: 現在のファイル外からは参照不可

Edition 2024のデフォルト機能値EXPORT_TOP_LEVELは、トップレベルのシンボルがデフォルトでエクスポートされ、ネストされたシンボルはデフォルトでローカルであることを保証します。

これは、Edition 2024で追加されたexportおよびlocalキーワードと組み合わせて、シンボルの可視性を明示的に注釈付けするために使用できます。

シンボルの可視性は、他のprotoファイルからインポートできるシンボルのみを制御し、コード生成には影響しません。

C++: enum_name_uses_string_view

以前は、生成されたすべての列挙型は、列挙値からラベルを取得するための以下の関数を提供していましたが、これは実行時にstd::stringインスタンスを構築するのにかなりのオーバーヘッドがありました。

const std::string& Foo_Name(int);

Edition 2024のデフォルト機能値は、このシグネチャをabsl::string_viewを返すように移行し、ストレージの分離を改善し、メモリ/CPUの節約の可能性を可能にします。

absl::string_view Foo_Name(int);

ユーザーは、移行ガイドに従って、新しい戻り値を処理するようにコードを移行する必要があります。

詳細については、String View APIを参照してください。

Java: nest_in_file_class

この機能は、Javaジェネレーターが生成されたクラスをJava生成ファイルクラスにネストするかどうかを制御します。

Edition 2024のデフォルト値は、デフォルトでクラスを独自のファイルに生成します。これは、以前のjava_multiple_files = trueファイルオプションのデフォルト動作でもあります。これにより、Edition 2024で削除されたjava_multiple_filesが置き換えられます。

デフォルトのアウタークラス名も、デフォルトで常にキャメルケースの.protoファイル名にProtoが接尾辞として付くように更新されます(例:foo/bar_baz.proto -> BarBazProto)。これは、java_outer_classnameファイルオプションを使用して上書きし、競合の有無に応じて、Edition 2024以前のデフォルトであるBarBazまたはBarBazOuterClassを置き換えることができます。

Java: large_enum

この機能により、Java言語によって課される標準的な定数制限のために列挙型の制限を超えて、大規模なJava列挙型を作成できます。

大規模な列挙型の作成はデフォルトでは有効になっていませんが、この機能を使用して明示的に有効にすることができます。この機能は列挙型のような動作を複製しますが、いくつかの顕著な違いがあります(例:switchステートメントはサポートされていません)。

文法変更点

import option

Edition 2024では、import option構文を使用したオプションのインポートがサポートされます。

通常のimportステートメントとは異なり、オプションのインポートは.protoファイルで定義されたカスタムオプションのみをインポートし、他のシンボルはインポートしません。

これは、メッセージと列挙型がオプションのインポートから除外されることを意味します。以下の例では、Barメッセージはfoo.protoのフィールド型として使用できませんが、Bar型のオプションは引き続き設定できます。

オプションのインポートは、他のすべてのimportステートメントの後に記述する必要があります。

// bar.proto
edition = "2024";

import "google/protobuf/descriptor.proto";

message Bar {
  bool bar = 1;
}

extend proto2.FileOptions {
  bool file_opt1 = 5000;
  Bar file_opt2 = 5001;
}
// foo.proto:
edition = "2024";

import option "bar.proto";

option (file_opt1) = true;
option (file_opt2) = {bar: true};

message Foo {
  // Bar bar = 1; // This is not allowed
}

オプションのインポートは、そのシンボルに対して生成されたコードを必要としないため、depsの代わりにproto_libraryoption_depsとして提供する必要があります。これにより、到達不能なコードの生成が回避されます。

proto_library(
  name = "foo",
  srcs = ["foo.proto"],
  option_deps = [":custom_option"]
)

protobuf言語機能やその他のカスタムオプションをインポートする際には、不要なコードの生成を避けるために、オプションのインポートとoption_depsが強く推奨されます。

option_depsはBazel 8以降が必要です。Bazel 7のnative.proto_libraryはこれをサポートしていません。

これは、Edition 2024で削除されたimport weakも置き換えます。

export / local キーワード

exportおよびlocalキーワードは、Edition 2024で、default_symbol_visibility機能で指定されたデフォルトの動作から、インポート可能なシンボルのシンボル可視性の修飾子として追加されました。

これは、他のprotoファイルからインポートできるシンボルを制御しますが、コード生成には影響しません。

Edition 2024では、これらはデフォルトですべてのメッセージおよび列挙型シンボルに設定できます。ただし、default_symbol_visibility機能の一部の値は、エクスポート可能なシンボルをさらに制限します。

// Top-level symbols are exported by default in Edition 2024
local message LocalMessage {
  // Nested symbols are local by default in Edition 2024
  export enum ExportedNestedEnum {
    UNKNOWN_EXPORTED_NESTED_ENUM_VALUE = 0;
  }
}

“import weak” および weak フィールドオプション

Edition 2024以降、弱いインポートは許可されなくなりました。

以前、C++およびGoで生成コードなしでカスタムオプションをインポートするために「弱い依存関係」を宣言するためにimport weakに頼っていたほとんどのユーザーは、代わりにimport optionを使用するように移行する必要があります。

ctype フィールドオプション

Edition 2024以降、ctypeフィールドオプションは許可されなくなりました。代わりにfeatures.(pb.cpp).string_type機能を使用してください。

java_multiple_files ファイルオプション

java_multiple_filesファイルオプションは、新しいfeatures.nest_in_file_class Java機能の導入に伴い、Edition 2024で削除されました。