移行ガイド
v30.0での変更点
以下は、ライブラリの各バージョンで行われた破壊的変更と、それに合わせてコードを更新する方法のリストです。
これは、v30.xのニュース発表およびv30.0のリリースノートで発表された破壊的変更を対象としています。
CMakeサブモジュールをFetched Depsに置き換え
以前は、デフォルトのCMakeの動作として、Gitサブモジュールを使用して固定された依存関係を取得していました。-Dprotobuf_ABSL_PROVIDER=package
を指定すると、CMakeの設定がAbseilのローカルインストールを探すように切り替わりました(jsoncppとgtestにも同様のオプションがありました)。これらのオプションはもはや存在せず、デフォルトの動作はまずすべての依存関係のインストールを探し、必要に応じてGitHubから固定バージョンをフェッチする形にフォールバックします。
フォールバックによるフェッチを防止するには(以前のpackage
動作と同様)、CMakeを次のように呼び出します。
cmake . -Dprotobuf_LOCAL_DEPENDENCIES_ONLY=ON
常に固定バージョンから依存関係をフェッチするには(以前のデフォルト動作と同様)、CMakeを次のように呼び出します。
cmake . -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON
string_viewの戻り値型
以下のディスクリプタAPIの戻り値型がabsl::string_view
になり、メモリ節約が可能になりました。
MessageLite::GetTypeName
UnknownField::length_delimited
FieldDescriptor::full_name
などのディスクリプタAPI名関数
今後の破壊的リリースでは、さらなるAPIをabsl::string_view
に移行し続ける予定です。
ほとんどの場合、安全な場所ではabsl::string_view
を使用するように型を更新するか、必要な場所では元の型に明示的にコピーするようにしてください。関数でこれが返される場合は、呼び出し元も更新する必要があるかもしれません。
影響を受けるAPIメソッドが返す文字列が以下のように使用されている場合
型 | 移行 |
---|---|
| 既存の動作を維持するために、 または、より高性能な |
|
(多数の依存関係のため)実行が困難な場合は、 |
| NULL許容の場合、 それ以外の場合、
|
一般的なコンテナやその他のAPIについては、absl::string_view
と互換性のあるバリアントに移行できる場合があります。以下にいくつかの一般的な例を示します。
カテゴリ | 移行前 | 移行 |
---|---|---|
std::vector<std::string> への挿入 |
|
|
マップまたはセットへの挿入 |
|
|
マップまたはセットのルックアップ |
| Abseilコンテナに移行してください。 または、透過的なコンパレータを定義してください。
詳細については、https://abseil.io/tips/144を参照してください。 |
文字列の連結 |
|
これらはパフォーマンス上の理由から推奨されています。詳細については、https://abseil.io/tips/3を参照してください。 |
absl::string_view
の使用に関する一般的なヒントについては、https://abseil.io/tips/1も参照してください。
MSVC + Bazelのポイズニング
Windows上のBazelユーザーは、この例のように、プロジェクトに以下を追加してclang-clの使用に切り替える必要があります。
.bazelrc
common --enable_platform_specific_config build:windows
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl
--extra_execution_platforms=//:x64_windows-clang-cl
MODULE.bazel
bazel_dep(name = "platforms", version = "0.0.10")
bazel_dep(name = "rules_cc", version = "0.0.17")
# For clang-cl configuration
cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension")
use_repo(cc_configure, "local_config_cc")
WORKSPACE
load("//:protobuf_deps.bzl", "PROTOBUF_MAVEN_ARTIFACTS", "protobuf_deps")
protobuf_deps()
load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains")
rules_cc_dependencies()
rules_cc_toolchains()
BUILD
Bazel 8のみとの互換性が必要なユーザー向け。
platform(
name = "x64_windows-clang-cl",
constraint_values = [
"@platforms//cpu:x86_64",
"@platforms//os:windows",
"@bazel_tools//tools/cpp:clang-cl",
],
)
Bazel 7および8との互換性が必要なユーザー向け。
platform(
name = "x64_windows-clang-cl",
constraint_values = [
"@platforms//cpu:x86_64",
"@platforms//os:windows",
# See https://github.com/bazelbuild/rules_cc/issues/330.
"@rules_cc//cc/private/toolchain:clang-cl",
],
)
ユーザーは、次の破壊的リリースまで、オプトアウトフラグ--define=protobuf_allow_msvc=true
を設定することで、一時的にエラーを抑制することもできます。
あるいは、MSVCを使い続けたいユーザーは、CMakeの使用に切り替えることができます。これはVisual Studioを使用するか、CMakeコマンドラインにMSVCジェネレータを指定することで可能です。例えば
cmake -G "Visual Studio 17 2022" -A Win64 .
FieldDescriptorオプションからctypeを削除
FieldDescriptor
オプションからctype
を公開するのを停止しました。代わりに、v28リリースで追加されたFieldDescriptor::cpp_string_type()
APIを使用できます。
機密フィールドを編集するためのデバッグAPIの変更
Protobuf C++デバッグAPI(Protobuf AbslStringify、proto2::ShortFormat
、proto2::Utf8Format
、Message::DebugString
、Message::ShortDebugString
、Message::Utf8DebugString
を含む)は、debug_redact
で注釈された機密フィールドを編集するように変更されました。これらのAPIの出力にはプロセスごとのランダムなプレフィックスが含まれ、Protobuf TextFormatパーサーでは解析できなくなりました。ユーザーは、人間が判読できる出力(ロギングなど)が必要なほとんどの場合に、新しい編集されたデバッグ形式を採用するか、シリアライゼーションとデシリアライゼーションにはバイナリ形式への切り替えを検討する必要があります。以前のデシリアライズ可能な形式が必要なユーザーはTextFormat.printer().printToString(proto)
を使用できますが、これは機密フィールドを編集しないため、注意して使用する必要があります。
詳細については、2024年12月4日にリリースされたニュース記事を参照してください。
非推奨APIの削除
少なくとも1つのマイナーリリースまたはメジャーリリースで非推奨(ABSL_DEPRECATED
など)としてマークされ、廃止または置き換えられた以下の公開ランタイムAPIを削除しました。
API: Arena::CreateMessage
代替: Arena::Create
API: Arena::GetArena
代替: value->GetArena()
API: RepeatedPtrField::ClearedCount
代替: アリーナに移行してください(移行ガイド)。
API: JsonOptions
代替: JsonPrintOptions
C++14のサポート終了
Foundational C++サポートマトリックスに従い、このリリースではC++14の最小サポートバージョンを廃止し、C++17に引き上げました。
ユーザーはC++17にアップグレードする必要があります。
アリーナ上のOneofメッセージをクリアした後のASANポイズニングの導入
この変更により、アリーナを使用するC++ protobufに影響を与える強化チェックが追加されました。protobufアリーナに割り当てられたOneofメッセージは、デバッグモードではクリアされ、ASANモードではポイズニングされます。クリアを呼び出した後、将来そのメモリ領域を使用しようとすると、ASANで解放後使用エラーとしてクラッシュを引き起こします。
この実装にはC++17が必要です。
C++ CocoaPodsリリースを廃止
v4.x.x以降壊れていたC++ CocoaPodsリリースを廃止しました。C++ユーザーは代わりに直接GitHubリリースを使用してください。
Pythonでの変更点
Pythonはメジャーバージョンを5.29.xから6.30.xに上げました。
Python 3.8のサポート終了
最小サポートPythonバージョンは3.9です。ユーザーはアップグレードする必要があります。
bazel/system_python.bzlエイリアスを削除
レガシーなbazel/system_python.bzl
エイリアスを削除しました。
system_python.bzl
への直接参照を削除し、代わりにprotobuf_deps.bzl
を使用してください。直接参照が必要な場合は、v5.27.0で移動されたpython/dist/system_python.bzl
を使用してください。
フィールドセッターの検証変更
Pythonおよびupbのフィールドセッターは、Edition 2023で閉じられたenumを検証するようになりました。無効な値で更新された閉じられたenumフィールドはエラーを生成します。
非推奨のpy_proto_libraryマクロを削除
非推奨の内部py_proto_library
Bazelマクロがprotobuf.bzl
から削除されました。これは、v29.xでbazel/py_proto_library
にあるprotobufに移動された公式のpy_proto_library
に置き換えられました。この実装は、v29.x以前はrules_python
で利用可能でした。
非推奨APIの削除
少なくとも1つのマイナーリリースまたはメジャーリリースで非推奨とマークされていた以下の公開ランタイムAPIを削除しました。
リフレクションメソッド
API: reflection.ParseMessage
, reflection.MakeClass
代替: message_factory.GetMessageClass()
RPCサービスインターフェース
API: service.RpcException
, service.Service
, service.RpcController
, および service.RpcChannel
代替: バージョン2.3.0以降、RPC実装はこれらに基づいて構築しようとするのではなく、特定のRPC実装に特化したコードを生成するコードジェネレータプラグインを提供する必要があります。
MessageFactoryおよびSymbolDatabaseメソッド
API: MessageFactory.GetPrototype
, MessageFactory.CreatePrototype
, MessageFactory.GetMessages
, SymbolDatabase.GetPrototype
, SymbolDatabase.CreatePrototype
, および SymbolDatabase.GetMessages
代替: message_factory.GetMessageClass()
および message_factory.GetMessageClassesForFiles()
。
GetDebugString
代替
代替はありません。これはPython C++のみに存在し、現在はリリースされていません。純粋なPythonやUPBではサポートされていません。
マップフィールドに対するPython setdefault動作の変更
setdefault
はScalarMap
の場合dict
に似ていますが、キーと値の両方が設定されている必要があります。setdefault
はMessageMaps
では拒否されます。
Pythonネストされたメッセージクラスの__qualname__に外部メッセージ名が含まれる
Pythonのネストされたメッセージクラスの__qualname__
に、外部メッセージ名が含まれるようになりました。以前は、ネストされたメッセージの場合、__qualname__
は__name__
と同じ結果となり、外部メッセージ名は含まれていませんでした。
例:
これはObjective-Cにとって最初の破壊的リリースです。
message Foo {
message Bar {
bool bool_field = 1;
}
}
nested = test_pb2.Foo.Bar()
self.assertEqual('Bar', nested.__class__.__name__)
self.assertEqual('Foo.Bar', nested.__class__.__qualname__) # It was 'Bar' before
Objective-Cでの変更点
Objective-Cはメジャーバージョンを3.x.xから4.30.xに上げました。.
不明なフィールド処理APIを刷新し、既存APIのほとんどを非推奨化
GPBUnknownFieldSet
を非推奨とし、GPBUnknownFields
に置き換えました。新しい型は、元の入力またはAPI呼び出しからの不明なフィールドの順序を保持し、メッセージが書き出される際に順序にセマンティックな意味が維持されるようにします。
これに伴い、GPBUnknownField
型にもAPIの変更があり、既存のAPIのほとんどが非推奨となり、新しいAPIが追加されました。
非推奨のプロパティAPI
varintList
fixed32List
fixed64List
lengthDelimitedList
groupList
非推奨の変更API
addVarint
addFixed32
addFixed64
addLengthDelimited
addGroup
非推奨のイニシャライザ
initWithNumber:
。
新しいプロパティAPI
type
varint
fixed32
fixed64
lengthDelimited
group
この型は、特定のフィールド番号のすべての値をグループ化するのではなく、その値に単一のフィールド番号をモデル化します。新しいフィールドを作成するためのAPIは、
GPBUnknownFields
クラスのadd*
APIです。
また、-[GPBMessage unknownFields]
も非推奨としました。その代わりに、メッセージの不明なフィールドを抽出および更新するための新しいAPIが用意されています。
GPBFileDescriptor
非推奨APIの削除
少なくとも1つのマイナーリリースまたはメジャーリリースで非推奨とマークされていた以下の公開ランタイムAPIを削除しました。
API: -[GPBFileDescriptor
syntax]
代替: 廃止。
GPBMessage mergeFrom:extensionRegistry
API: -[GPBMessage mergeFrom:extensionRegistry:
]
代替: -[GPBMessage mergeFrom:extensionRegistry:error:
]
GPBDuration timeIntervalSince1970
API: -[GPBDuration timeIntervalSince1970
]
代替: -[GPBDuration timeInterval
]
GPBTextFormatForUnknownFieldSet
API: GPBTextFormatForUnknownFieldSet()
代替: 廃止 - 不明なフィールドを含むGPBTextFormatForMessage()
を使用してください。
GPBUnknownFieldSet
API: GPBUnknownFieldSet
代替: GPBUnknownFields
GPBMessage unknownFields
API: GPBMessage unknownFields
プロパティ
代替: -[GPBUnknownFields initFromMessage:
], -[GPBMessage mergeUnknownFields:extensionRegistry:error:
], および -[GPBMessage clearUnknownFields
]
古いGencode向けの非推奨ランタイムAPIを削除
このリリースでは、3.22.xリリース以前のObjective-C gencodeをサポートしていた非推奨のランタイムメソッドを削除しました。ライブラリはまた、古い生成コードが起動する際にランタイムでログメッセージを発行します。
API: +[GPBFileDescriptor allocDescriptorForClass:file:fields:fieldCount:storageSize:flags:]
代替: ライブラリの現在のバージョンで再生成してください。
API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]
API: +[GPBEnumDescriptor allocDescriptorForName:valueNames:values:count:enumVerifier:]
API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]
API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]
API: -[GPBExtensionDescriptor initWithExtensionDescription:]
API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]
新しいローリングアップグレードポリシーの下で機能するが、次のメジャーバージョンアップで動作しなくなる古いGencodeと新しいランタイムの組み合わせについて、ポイズンピルが警告を発するように更新しました。例えば、Python 4.x.xのGencodeは5.x.xランタイムに対して機能しますが、6.x.xランタイムに対しては今後の互換性破損について警告を発します。
API: +[GPBFileDescriptor allocDescriptorForClass:rootClass:file:fields:fieldCount:storageSize:flags:]
ポイズンピルの警告
言語間でUTF-8の強制を一致させる修正を加えました。文字列フィールドに不正な非UTF-8データを持つユーザーは、UTF-8強制エラーがより早く表面化する可能性があります。
C#とRubyにおけるUTF-8強制の変更
JSON仕様に従い、数値フィールド内の文字列のJSON解析における非準拠を修正しました。
JSONパースにおけるRubyとPHPのエラー
この修正にはメジャーバージョンアップは伴いませんが、RubyとPHPは、数値フィールド内の非数値文字列(""
、"12abc"
、"abc"
など)に対してエラーを発生させるようになりました。v29.xでは、これらのエラーケースに対する警告が含まれています。
v22.0におけるコンパイラの変更点
JSONフィールド名の競合
JSONマッピングにおけるフィールド名の競合の処理方法にいくつかの微妙な変更を加えました。proto3では、制限を部分的に緩和し、フィールド名が大文字と小文字を区別するJSONマッピング(元の名前のキャメルケース)を生成する場合にのみエラーを出すようにしました。また、json_name
オプションもチェックし、大文字と小文字を区別する競合についてはエラーを出すようにしました。proto2では、制限を少し厳しくし、2つのjson_name
指定が競合する場合はエラーを出すようにします。暗黙的なJSONマッピング(キャメルケース)に競合がある場合は、proto2で警告を出します。
レガシーな動作を復元するための一時的なメッセージ/enumオプションを提供しました。競合するフィールドの名前変更をすぐに実行できない場合は、特定のメッセージ/enumにdeprecated_legacy_json_field_conflicts
オプションを設定してください。このオプションは将来のリリースで削除されますが、移行のための時間を稼ぐことができます。
4.22.0には、8月に発表されたC++ランタイムとprotocに対する破壊的変更が含まれています。
v22.0におけるC++ APIの変更点
変更元: PR #10132
Autotoolsの廃止
v22.0では、protobufコンパイラとC++ランタイムからすべてのAutotoolsサポートを削除しました。これらのいずれかをAutotoolsを使用してビルドしている場合、CMakeまたはBazelに移行する必要があります。CMakeでprotobufをセットアップするための専用の手順がいくつかあります。
変更元: PR #10416
Abseilの依存関係
v22.0では、Abseilへの明示的な依存関係を採用しました。これにより、以前は古い内部コードから分岐し、後にAbseilとなったほとんどのスタブを削除することができました。いくつかの微妙な動作変更がありますが、ほとんどはユーザーにとって透過的であるはずです。注目すべき変更点は以下のとおりです。
string_view - 多くのAPIでconst std::string&
がabsl::string_view
に置き換えられました。これは入力引数で最も一般的に使用され、ユーザーには目立った変更はありません。いくつかのケース(仮想メソッドの引数や戻り値の型など)では、新しいシグネチャを使用するために明示的な変更が必要になる場合があります。
テーブル - STLのセット/マップの代わりに、Abseilの
flat_hash_map
、flat_hash_set
、btree_map
、およびbtree_set
を使用するようになりました。これらはより効率的であり、異種ルックアップを可能にします。これはほとんどユーザーには見えませんが、テーブルの順序に関連するいくつかの微妙な動作変更を引き起こす可能性があります。ロギング - Abseilのロギングライブラリは、スペルが少し異なる(例えば、
GOOGLE_CHECK
の代わりにABSL_CHECK
)だけで、以前のロギングコードと非常によく似ています。最大の違いは、例外をサポートしておらず、FATAL
アサーションが失敗すると常にクラッシュするようになったことです。(以前は、例外に切り替えるためのPROTOBUF_USE_EXCEPTIONS
フラグがありました。)これらは深刻な問題が発生した場合にのみ発生するため、無条件のクラッシュが適切な応答であると考えています。ロギング変更元: PR #11623
ビルド依存関係 - 新しいビルド依存関係は、常にダウンストリームのユーザーに互換性破損を引き起こす可能性があります。ビルドにはAbseil LTS 20230125以降が必要です。
Bazelビルドの場合、
WORKSPACE
からprotobuf_deps
が実行されると、Abseilはピン留めされたLTSリリースで自動的にダウンロードおよびビルドされます。これは透過的であるはずですが、古いバージョンのAbseilに依存している場合は、依存関係をアップグレードする必要があります。CMakeビルドの場合、まずトップレベルのCMake設定によって取り込まれた既存のAbseilインストールを探します(手順を参照)。それ以外の場合、
protobuf_ABSL_PROVIDER
がmodule
(デフォルト値)に設定されていると、GitサブモジュールからAbseilをビルドしてリンクしようとします。protobuf_ABSL_PROVIDER
がpackage
に設定されている場合、プリインストールされたシステムのAbseilバージョンを探します。Windowsでは、
GetCurrentTime()
はシステムによって提供されるマクロの名前です。v22.x以前では、ProtobufはGetCurrentTime()
のマクロ定義を誤って削除していました。そのため、<protobuf/util/time_util.h>
を含んだ後、Windows開発者はそのマクロを使用できませんでした。v22.x以降、Protobufはマクロ定義を保持します。これにより、google::protobuf::util::TimeUtil::GetCurrentTime()
のような表現を使用するなど、以前の動作に依存している顧客のコードが壊れる可能性があります。
GetCurrentTimeメソッドの変更点
アプリケーションを新しい動作に移行するには、コードを次のいずれかのように変更してください。
GetCurrent
マクロが定義されている場合、GetCurrentTime
マクロを明示的に未定義にする
(google::protobuf::util::TimeUtil::GetCurrentTime)()
または類似の式を使用してマクロ展開を防止する- 例: マクロの未定義
Windowsからマクロを使用しない場合は、このアプローチを使用してください。
変更前
変更後
#include <google/protobuf/util/time_util.h>
void F() {
auto time = google::protobuf::util::TimeUtil::GetCurrentTime();
}
例2: マクロ展開の防止
#include <google/protobuf/util/time_util.h>
#ifdef GetCurrentTime
#undef GetCurrentTime
#endif
void F() {
auto time = google::protobuf::util::TimeUtil::GetCurrentTime();
}
変更元: PR #10796
変更後
#include <google/protobuf/util/time_util.h>
void F() {
auto time = google::protobuf::util::TimeUtil::GetCurrentTime();
}
例2: マクロ展開の防止
#include <google/protobuf/util/time_util.h>
void F() {
auto time = (google::protobuf::util::TimeUtil::GetCurrentTime)();
}
C++20のサポート
C++20をサポートするため、C++で生成されるprotobufコードで新しいキーワードを予約しました。他の予約キーワードと同様に、フィールド、enum、またはメッセージにこれらを使用した場合、有効なC++にするためにアンダースコアのサフィックスが追加されます。例えば、concept
フィールドはconcept_()
ゲッターを生成します。これらのキーワードを使用している既存のprotoがある場合、それらを参照するC++コードを更新して、適切なアンダースコアを追加する必要があります。
変更元: PR #11604
Finalクラス
Protobufライブラリの仮定を強化するための大規模な取り組みの一環として、継承されることを意図していなかった一部のクラスをfinal
としてマークしました。これらのクラスから継承する既知のユースケースはなく、そうすると問題を引き起こす可能性が高いです。コードがこれらのクラスから継承している場合の緩和策はありませんが、使用している継承に正当な理由があると思われる場合は、イシューを開いてください。
変更元: PR #11550
コンテナの静的アサーション
Protobufライブラリの仮定を強化するための大規模な取り組みの一環として、Map
、RepeatedField
、およびRepeatedPtrField
コンテナに静的アサーションを追加しました。これらは、ドキュメントに記載されているように、これらのコンテナを期待される型でのみ使用していることを保証します。これらの静的アサーションに遭遇した場合、AbseilまたはSTLコンテナを使用するようにコードを移行する必要があります。std::vector
は繰り返しフィールドコンテナの良い代替となり、Map
にはstd::unordered_map
またはabsl::flat_hash_map
が良いでしょう(前者は同様のポインタ安定性を提供し、後者はより効率的です)。
クリアされた要素の非推奨化
「クリアされたフィールド」に関するRepeatedPtrField
APIは非推奨となり、今後の破壊的リリースで完全に削除されます。これは元々、要素がクリアされた後に再利用するための最適化として追加されましたが、うまく機能しませんでした。このAPIを使用している場合、より良いメモリ再利用のためにアリーナへの移行を検討する必要があります。
変更元: PR #10325
UnsafeArenaの非推奨化
アリーナセーフではないAPIを削除する大規模な取り組みの一環として、RepeatedField::UnsafeArenaSwap
を非表示にしました。これはこれまでに削除した唯一のものですが、今後のリリースではこれらを削除し続け、アリーナ間の効率的な借用パターンを処理するヘルパーを提供します。単一のアリーナ内(またはスタック/ヒープ)では、Swap
はUnsafeArenaSwap
と同じくらい効率的です。異なるアリーナ間で誤って呼び出しても、無効なメモリ操作を引き起こさないという利点があります。
変更元: PR #11625
Map Pairのアップグレード
v22.0では、AbseilおよびSTLとの一貫性を高めるため、Map
APIのクリーンアップを開始しました。特に、MapPair
クラスをstd::pair
のエイリアスに置き換えました。これはほとんどのユーザーにとって透過的であるはずですが、このクラスを直接使用していた場合はコードを更新する必要があるかもしれません。
変更元: PR #10729
新しいJSONパーサー
このリリースでC++ JSONパーサーを書き換えました。ほとんど隠れた変更であるはずですが、必然的にいくつかの未文書化の癖が変わっている可能性があります。それに応じてテストしてください。有効なRFC-8219 JSONではないドキュメント(引用符が欠けているものや非標準のboolを使用しているものなど)の解析は非推奨となり、将来のリリースで削除されます。フィールドのシリアライゼーション順序は、以前は決定論的ではなかったですが、フィールド番号の順序と一致することが保証されるようになりました。
この移行の一環として、util/internal以下のすべてのファイルが削除されました。これらは古いパーサーで使用されており、外部で使用されることを意図していませんでした。
変更元: PR #10623
Arena::Init
Arena
のInit
メソッドは何も行わないコードであり、現在削除されています。このメソッドを呼び出していた場合、おそらくArenaOptions
のセットを直接指定してArena
コンストラクタを呼び出すことを意図していたでしょう。その呼び出しを削除するか、そのコンストラクタに移行する必要があります。
変更元: PR #11555
ErrorCollectorの移行
Abseilへの移行の一環として、const std::string&
からabsl::string_view
への移行を進めています。3つのエラーコレクタクラスについては、既存のコードを壊さずにこれを行うことはできません。v22.0では、両方のバリアントをリリースし、メソッド名をAddError
とAddWarning
からRecordError
とRecordWarning
に変更することを決定しました。古いシグネチャは非推奨とマークされており、わずかに効率が悪くなります(文字列のコピーのため)が、それ以外は引き続き機能します。Add*
メソッドは今後の破壊的リリースで削除されるため、これらを新しいバージョンに移行する必要があります。
© 2025 Google LLC All Rights Reserved プライバシーポリシー GitHub Pagesでホストされています。 GitHubプライバシーステートメント