proto3 にアップグレードすることを決定しましたが、しばらくの間、proto2 を実行しているデバイスと通信できる必要があります。
現在、キーワードが原因で proto2 側でデシリアライズできないメッセージがいくつかあるという問題に直面していますrequired
。
これは、問題のあるメッセージの 1 つです (proto2)。
message time_value
{
required uint32 hour = 1;
required uint32 minutes = 2;
required uint32 microseconds = 3;
}
このメッセージを proto2 クライアントに送信しようとして、時間 = 1、分 = 2、マイクロ秒 = 0 のような値を設定した場合、クライアントはこのメッセージを逆シリアル化できません。microseconds=1 に設定すると、proto2 クライアントは問題なくメッセージを読み取ることができます。
これは、次の生成された C# コードに要約されます
public void WriteTo(pb::CodedOutputStream output) {
...
if (Microseconds != 0) {
output.WriteRawTag(48);
output.WriteUInt32(1);
}
...
}
そのため、フィールドの値がデータ型のデフォルト値と同じである場合、生成された proto3 コードはフィールドを送信しないようです。もちろん、これは proto2 を混乱させ、メッセージをデシリアライズしたくありません。なぜなら、フィールドは としてマークされてrequired
いますが、値が受信されていないからです。
(デフォルト値が設定されていても) 常にすべてのフィールドを送信するコードを生成するようにプロトコルを強制することは可能ですか、それとも他の方法で解決できますか?
ありがとう