On Wed, Dec 20, 2017 at 4:18 PM, Behrang Saeedzadeh <[email protected]>
wrote:

> Unfortunately I don't own the actual protocol buffer models and can't
> change their definitions.
>
> What I actually want to do is this: I have a Protocol buffer model in
> byte[] format. I want to deserialize it back to Java objects but then
> replace all the ID fields in the model, including its extensions.
>
> For example, I have a "template" Employee model in byte[] format, and I
> want to create new Java objects using that template. After deserializing
> the byte array to a Java object, I want to change the UserHeader.userID and
> ID of all the skills in it.
>
> Is there a fluent API or a concise way available to do this?
>
Why not just use protobuf binary format? For example:

byte[] data = userBuilder.build().toByteArray();

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


>
>
>
> On Thursday, December 21, 2017 at 10:56:10 AM UTC+11, Feng Xiao wrote:
>>
>> JsonFormat doesn't support extensions. You can replace extensions with
>> google.protobuf.Any if you want to use the proto with JsonFormat.
>>
>> On Wed, Dec 20, 2017 at 3:39 PM, Behrang Saeedzadeh <[email protected]>
>> wrote:
>>
>>>
>>>
>>> *down vote**favorite*
>>> <https://stackoverflow.com/questions/47903567/how-to-fix-com-google-protobuf-invalidprotocolbufferexception-cannot-find-fiel#>
>>>
>>> *Cross-post from
>>> StackOverflow: 
>>> https://stackoverflow.com/questions/47903567/how-to-fix-com-google-protobuf-invalidprotocolbufferexception-cannot-find-fiel
>>> <https://stackoverflow.com/questions/47903567/how-to-fix-com-google-protobuf-invalidprotocolbufferexception-cannot-find-fiel>*
>>>
>>> I have 2 Protobuf models:
>>> User:
>>>
>>> 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;}
>>>
>>> Employee:
>>>
>>> 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;}
>>>
>>> I can create a model and serialize it to JSON using
>>> JsonFormat.printer().print(...):
>>>
>>> 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());
>>>
>>> However deserializing the generated JSON back to Java objects fails with
>>> com.google.protobuf.InvalidProtocolBufferException: Cannot find field:
>>> details in message demo.User:
>>>
>>> UserModel.User.Builder userBuilder2 = UserModel.User.newBuilder();
>>> JsonFormat.parser().merge(json, userBuilder2);
>>>
>>> And there doesn't seem to be a way to pass an ExtensionRegistry to
>>> JsonFormat.parser()either.
>>>
>>> Is there a way to make this *Protobuf → JSON → Protobuf*
>>>  serialization/deserialization chain work?
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Protocol Buffers" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at https://groups.google.com/group/protobuf.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/protobuf.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to