2025年6月27日に発表された変更点
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_library
のoption_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で削除されました。