java protobuf 例子_基于Protobuf动态解析在Java中的应用 包含例子程序
时间: 2023-07-25 14:15:08 浏览: 54
以下是一个基于Protobuf动态解析在Java中的示例程序:
1. 下载protobuf-java.jar和protobuf-java-util.jar包并添加到classpath中。
2. 定义一个proto文件,例如:
```
syntax = "proto3";
message Person {
string name = 1;
int32 age = 2;
repeated string hobbies = 3;
}
```
3. 使用protoc编译proto文件,生成Java类:
```
protoc --java_out=. person.proto
```
4. 在Java中动态解析protobuf消息:
```
import com.google.protobuf.DynamicMessage;
import com.google.protobuf.Descriptors;
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.ByteString;
public class DynamicProtoExample {
public static void main(String[] args) throws Exception {
Descriptors.Descriptor descriptor = Person.getDescriptor(); // Person是生成的Java类
DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor);
builder.setField(descriptor.findFieldByName("name"), "Tom");
builder.setField(descriptor.findFieldByName("age"), 18);
builder.addRepeatedField(descriptor.findFieldByName("hobbies"), "reading");
builder.addRepeatedField(descriptor.findFieldByName("hobbies"), "swimming");
DynamicMessage message = builder.build();
ByteString data = message.toByteString();
DynamicMessage parsedMessage = DynamicMessage.parseFrom(descriptor, data);
String name = parsedMessage.getField(descriptor.findFieldByName("name")).toString();
int age = (int) parsedMessage.getField(descriptor.findFieldByName("age"));
List<String> hobbiesList = parsedMessage.getRepeatedField(descriptor.findFieldByName("hobbies"));
System.out.println("Name: " + name + ", Age: " + age + ", Hobbies: " + hobbiesList);
}
}
```
这个程序动态创建了一个Person消息,将它转化为字节数组,然后再将其解析回Person消息,并从中获取字段值。
这是一个简单的示例,但它演示了如何使用Protobuf动态解析在Java中创建和解析消息。