fjod commented on pull request #8372: URL: https://github.com/apache/pulsar/pull/8372#issuecomment-806366160
@hnail I think some bug in deserialize method of ProtobufNativeSchemaUtils. I generated descriptor using probuf-net library, here it is **CgpUZXN0LnByb3RvEgVwcm90byImCgpYWFhNZXNzYWdlEgsKA2ZvbxgBIAEoCRILCgNiYXIYAiABKAFCD6oCDG5hdGl2ZUNoZWNrMmIGcHJvdG8z** . If you check it on https://protogen.marcgravell.com/decode , it decodes fine. Here is json file with some additional fields: {"fileDescriptorSet":"ClMKClRlc3QucHJvdG8SC25hdGl2ZUNoZWNrIjAKClhYWE1lc3NhZ2USEAoDZm9vGAEgASgJUgNmb28SEAoDYmFyGAIgASgBUgNiYXJiBnByb3RvMw==","rootMessageTypeName":"proto.XXXMessage","rootFileDescriptorName":"Test.proto"} When I try to send it to apache-pulsar server, I get null-pointer exception on line 104 at https://github.com/apache/pulsar/blob/2a1828ca08f096a94b696737e93e84a2bc60a8cc/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/ProtobufNativeSchemaUtils.java#L104 I created sample java app copy-pasting code from ProtobufNativeSchemaUtils. Here is simpler version of deserializer: ``` File file; Descriptors.Descriptor descriptor; file = new File("D:\\serialized"); byte[] fileContent = Files.readAllBytes(file.toPath()); ProtobufNativeSchemaData schemaData = new ObjectMapper().readValue(fileContent, ProtobufNativeSchemaData.class); FileDescriptorSet fileDescriptorSet = FileDescriptorSet.parseFrom(schemaData.fileDescriptorSet); Map<String, FileDescriptorProto> fileDescriptorProtoCache = new HashMap<>(); Map<String, Descriptors.FileDescriptor> fileDescriptorCache = new HashMap<>(); fileDescriptorSet.getFileList().forEach(fileDescriptorProto -> fileDescriptorProtoCache.put(fileDescriptorProto.getName(), fileDescriptorProto)); FileDescriptorProto rootFileDescriptorProto = fileDescriptorProtoCache.get("Test.proto"); deserializeFileDescriptor(rootFileDescriptorProto, fileDescriptorCache, fileDescriptorProtoCache); Descriptors.FileDescriptor fileDescriptor = fileDescriptorCache.get("Test.proto"); System.out.print(fileDescriptor.toProto()); ``` output is: ``` name: "Test.proto" package: "nativeCheck" message_type { name: "XXXMessage" field { name: "foo" number: 1 label: LABEL_OPTIONAL type: TYPE_STRING json_name: "foo" } field { name: "bar" number: 2 label: LABEL_OPTIONAL type: TYPE_DOUBLE json_name: "bar" } } syntax: "proto3" ``` **So Descriptor is fine**! But if I try to use code from the repo: ``` Descriptors.Descriptor descriptor2; Descriptors.FileDescriptor fileDescriptor2 = fileDescriptorCache.get(schemaData.rootMessageTypeName); String package1 = fileDescriptor2.getPackage(); //trim package String[] paths = StringUtils.removeFirst(schemaData.rootMessageTypeName, package1).replaceFirst("\\.", "").split("\\."); //extract root message descriptor2 = fileDescriptor2.findMessageTypeByName(paths[0]); //extract nested message for (int i = 1; i < paths.length; i++) { descriptor2 = descriptor2.findNestedTypeByName(paths[i]); } System.out.print(descriptor2.toProto()); ``` I get nullpointer exception on line with getPackage(); - similar to apache-pulsar exception.  I guess our generated descriptor does not contain such "package" and fails therefore? It would be great if we can use descriptor from our client too ;) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: [email protected]
