0

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いますが、値が受信されていないからです。

(デフォルト値が設定されていても) 常にすべてのフィールドを送信するコードを生成するようにプロトコルを強制することは可能ですか、それとも他の方法で解決できますか?

ありがとう

4

0 に答える 0