java解析.proto文件具体方法 (二)

2014-11-24 11:54:46 · 作者: · 浏览: 52
c class Test {

public static void main(String[] args) throws Exception {

Runtime run = Runtime.getRuntime();

String dir = System.getProperty("user.dir");
String source = dir + "/protoc/";
String cmd = "cmd /c " + source + "protoc.exe -I=" + source + " --descriptor_set_out="+ source +"addressbook.desc "+ source +"addressbook.proto";
System.out.println(cmd);

Process p = run.exec(cmd);

// 如果不正常终止, 则生成desc文件失败
if (p.waitFor() != 0) {
if (p.exitValue() == 1) {//p.exitValue()==0表示正常结束,1:非正常结束
System.err.println("命令执行失败!");
System.exit(1);
}
}

Map mapping = new HashMap();

FileInputStream fin = new FileInputStream("addressbook.desc");
FileDescriptorSet descriptorSet = FileDescriptorSet.parseFrom(fin);

for (FileDescriptorProto fdp: descriptorSet.getFileList()) {
FileDescriptor fd = FileDescriptor.buildFrom(fdp, new FileDescriptor[]{});

for (Descriptor descriptor : fd.getMessageTypes()) {
String className = fdp.getOptions().getJavaPackage() + "."
+ fdp.getOptions().getJavaOuterClassname() + "$"
+ descriptor.getName();
List types = descriptor.getFields();
for(FieldDescriptor type : types) {
System.out.println(type.getFullName());
}
System.out.println(descriptor.getFullName() + " -> " + className);
}
}



// Descriptor md = fd.getDescriptorForType();
// byte[] data = null ;
// DynamicMessage m = DynamicMessage.parseFrom(md, data);


}

}


  三、结果截图

\

[java]
package com.example.tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}

repeated PhoneNumber phone = 4;
}

message AddressBook {
repeated Person person = 1;
}

package com.example.tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;

enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}

message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}

repeated PhoneNumber phone = 4;
}

message AddressBook {
repeated Person person = 1;
}