1

Java Protobufを使用して、Protobuf-netでシリアル化された次のDerivedMessageを逆シリアル化することは可能ですか?

namespace Test.Protobuf
{
  [ProtoBuf.ProtoContract]
  [ProtoBuf.ProtoInclude(2550, "Test.Protobuf.DerivedMessage")]
  class BaseMessage
  {
    [ProtoBuf.ProtoMember(1)]
    public string MessageId { get; set; }

    [ProtoBuf.ProtoMember(2)]
    public int CommandId { get; set; }
  }

  [ProtoBuf.ProtoContract]
  class DerivedMessage : BaseMessage
  {
    [ProtoBuf.ProtoMember(1)]
    public int ClientId { get; set; }

    [ProtoBuf.ProtoMember(2)]
    public string Message { get; set; }

    [ProtoBuf.ProtoMember(3)]
    public string Description { get; set; }
  }
}

DerivedMessageはBaseMessageを拡張し、ドキュメントを読むと、ソリューションはプロトファイルでネストされたメッセージを使用しているようですが、機能しません。ここでは私のプロトファイルです。

package protobuf;

option java_package = "test.protobuf";
option java_outer_classname = "Proto";

message BaseMessage {
    optional string message_id = 1;
    optional int32 command_id = 2;
}

message DerivedMessage {
    optional int32 client_id = 1;
    optional string token = 2;
    optional string message = 3;
    optional string description = 4;
    optional BaseMessage base_message = 5;
}

解決策はありますか?

ありがとうございました

4

2 に答える 2

0

フィールド番号は一致する必要があり、DerivedMessage ではなく BaseMessage に入ります。

無関係なニュースでは、DerivedMessage の他のフィールドが壊れているように見えます。「トークン」は数値から来ており、後の 2 つのフィールドは 1 つずつずれています。

message BaseMessage {
    optional string message_id = 1;
    optional int32 command_id = 2;
    optional DerivedMessage derived_message = 2550;
}

message DerivedMessage {
    optional int32 client_id = 1;
    optional string message = 2;
    optional string description = 3;
}
于 2012-05-20T20:57:21.583 に答える
0

派生クラスが親クラスと同じ ID のフィールドを持つべきではない可能性はありますか? あなたの例では、 messageId と clientId の両方に同じ識別子があります: 1.

于 2012-05-20T22:10:45.567 に答える