Restoring .proto file from descriptor string. Possible?

别来无恙 提交于 2019-12-01 01:30:49

Yes it should be possible to get some thing close get original definition. I do not know of any existing code to do it (hopefully some one else will).

Hava a look at how protocol buffers itself handles the String.

Basically

  1. convert the string to bytes (using charset="ISO-8859-1" in java), it will then be a Protocol-Buffer message(format=FileDescriptorProto in java). The FileDescriptorProto is built as part of the Protocol-Buffers install.

  2. Extract the data in the Protocol-Buffer message

Here is a File-Descriptor protocol displayed in the Protocol-Buffer editor

In C++, the FileDescriptor interface has a method DebugString() which formats the descriptor contents in .proto syntax -- i.e. exactly what you want. In order to use it, you first need to write code to convert the raw FileDescriptorProto to a FileDescriptor, using the DescriptorPool interface.

Something like this should do it:

#include <google/protobuf/descriptor.h>
#include <google/protobuf/descriptor.pb.h>
#include <iostream>

int main() {
  google::protobuf::FileDescriptorProto fileProto;
  fileProto.ParseFromFileDescriptor(0);
  google::protobuf::DescriptorPool pool;
  const google::protobuf::FileDescriptor* desc =
      pool.BuildFile(fileProto);
  std::cout << desc->DebugString() << std::endl;
  return 0;
}

You need to feed this program the raw bytes of the FileDescriptorProto, which you can get by using Java to encode your string to bytes using the ISO-8859-1 charset.

Also note that the above doesn't work if the file imports any other files -- you would have to load those imports into the DescriptorPool first.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!