Flux de sortie codé
Une façon d'y parvenir est de comprendre comment une le message est encodé et utiliser le Flux de sortie codé pour écrire des champs de messages avec les write*()
des méthodes.
Par exemple, pour écrire le message suivant :
message MyMessage {
int foo = 1;
string bar = 2;
}
Vous utiliserez ce morceau de code :
ByteArrayOutputStream baos = new ByteArrayOutputStream();
CodedOutputStream out = CodedOutputStream.newInstance(baos);
out.writeInt32(1, 1);
out.writeString(2, "s");
out.flush();
byte[] rawProtocolBuffer = baos.toByteArray();
Message dynamique
Une autre méthode consiste à créer les descripteurs à la main, puis à utiliser la fonction DynamicMessage
pour définir les champs respectifs, mais c'est plus fastidieux que d'utiliser CodedOutputStream
directement.
String messageName = "MyMessage";
FileDescriptorProto fileDescriptorProto = FileDescriptorProto
.newBuilder()
.addMessageType(DescriptorProto.newBuilder()
.setName(messageName)
.addField(FieldDescriptorProto.newBuilder()
.setName("foo")
.setNumber(1)
.setType(FieldDescriptorProto.Type.TYPE_INT32)
.build())
.addField(FieldDescriptorProto.newBuilder()
.setName("bar")
.setNumber(2)
.setType(FieldDescriptorProto.Type.TYPE_STRING)
.build())
.build())
.build();
Descriptor messageDescriptor = FileDescriptor
.buildFrom(fileDescriptorProto, new FileDescriptor[0])
.findMessageTypeByName(messageName);
DynamicMessage message = DynamicMessage
.newBuilder(messageDescriptor)
.setField(messageDescriptor.findFieldByNumber(1), 1)
.setField(messageDescriptor.findFieldByName("bar"), "s")
.build();
byte[] rawProtocolBuffer = message.toByteArray();