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

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

エディション 2024

Protobuf Edition 2024は、2025年第3四半期に32.xでリリースされる予定です。

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

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

既存の機能への変更

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

C++ string_type

エディション2023で最初にリリースされたstring_type機能のデフォルトは、エディション2024でSTRINGからVIEWに変更されます。

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

新機能

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

enforce_naming_style

feature.enforce_naming_styleは、プロトタイプがデフォルトでラウンドトリップ可能であることを保証するために、厳密な命名スタイル強制を有効にし、レガシー命名スタイルを使用しないための機能値を提供します。

default_symbol_visibility

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

  • export: import文を介して他のプロトタイプから参照可能
  • local: 現在のファイルの外部からは参照不可

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

これは、エディション2024で追加されたexportlocalキーワードと組み合わせて、シンボル可視性を明示的に注釈付けするために使用できます。

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

C++: enum_name_uses_string_view

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

const std::string& Foo_Name(int);

エディション2024のデフォルト機能値は、このシグネチャをabsl::string_viewを返すように移行し、より良いストレージの分離と潜在的なメモリ/CPUの節約を可能にします。

absl::string_view Foo_Name(int);

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

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

Java: nest_in_file_class

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

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

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

Java: large_enum

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

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

文法の変更

import option

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

通常のimport文とは異なり、import optionは、他のシンボルをインポートすることなく、.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を強くお勧めします。

Bazel 7のnative.proto_libraryはこの機能をサポートしていないため、option_depsにはBazel 8以降が必要です。

これにより、エディション2024で削除されたimport weakも置き換えられます。

export / local キーワード

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

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

エディション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 フィールドオプション

エディション2024以降、弱いインポートは許可されなくなりました。

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

ctype フィールドオプション

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

java_multiple_files ファイルオプション

java_multiple_filesファイルオプションは、新しいfeatures.nest_in_file_class Java機能の代わりに、エディション2024で削除されました。