Wie behebe ich „com.google.protobuf.InvalidProtocolBufferException: Feld kann nicht gefunden werden“, das von JsonFormatJava

Java-Forum
Anonymous
 Wie behebe ich „com.google.protobuf.InvalidProtocolBufferException: Feld kann nicht gefunden werden“, das von JsonFormat

Post by Anonymous »

Ich habe 2 Protobuf-Modelle:

Code: Select all

User
:

Code: Select all

package demo;

option java_package = "com.stackoverflow.question";
option java_outer_classname = "UserModel";

message User {

message UserHeader {
required int64 userId = 1;
}

required UserHeader header = 1;

extensions 100 to 200;
}

Code: Select all

Employee
:

Code: Select all

import "person.proto";

package demo;

option java_package = "com.stackoverflow.question";
option java_outer_classname = "EmployeeModel";

extend demo.User {
optional EmployeeDetails details = 101;
}

message EmployeeDetails {
required string department = 1;
repeated Skill skills = 2;
}

message Skill {
required int64 id = 1;
required string name = 2;
}
Ich kann ein Modell erstellen und es mit JsonFormat.printer().print(...) in JSON serialisieren:

Code: Select all

ExtensionRegistry registry = ExtensionRegistry.newInstance();
EmployeeModel.registerAllExtensions(registry);

UserModel.User.Builder userBuilder = UserModel.User.newBuilder();
userBuilder.setHeader(UserModel.User.UserHeader.newBuilder().setUserId(1000));

EmployeeModel.EmployeeDetails.Builder employeeBuilder = EmployeeModel.EmployeeDetails.newBuilder();
employeeBuilder.setDepartment("Department 1")
.addSkills(EmployeeModel.Skill.newBuilder()
.setId(10_000)
.setName("Skill 10_0000")
.build())
.addSkills(EmployeeModel.Skill.newBuilder()
.setId(11_000)
.setName("Skill 11_0000")
.build());

userBuilder.setExtension(EmployeeModel.details, employeeBuilder.build());

final String json = JsonFormat.printer().print(userBuilder.build());
Die Deserialisierung des generierten JSON zurück in Java-Objekte schlägt jedoch mit com.google.protobuf.InvalidProtocolBufferException: Cannot find field: details in message demo.User:

fehl

Code: Select all

UserModel.User.Builder userBuilder2 = UserModel.User.newBuilder();

JsonFormat.parser().merge(json, userBuilder2);
Und es scheint auch keine Möglichkeit zu geben, eine ExtensionRegistry an JsonFormat.parser() zu übergeben.

Gibt es eine Möglichkeit, diese Serialisierungs-/Deserialisierungskette Protobuf → JSON → Protobuf zum Laufen zu bringen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post