Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.0 KiB
60 lines
2.0 KiB
13 years ago
|
/*
|
||
|
* upb - a minimalist implementation of protocol buffers.
|
||
|
*
|
||
|
* Copyright (c) 2011 Google Inc. See LICENSE for details.
|
||
|
* Author: Josh Haberman <jhaberman@gmail.com>
|
||
|
*
|
||
|
* A simple example that demonstrates creating a standard message object
|
||
|
* and parsing into it, using a dynamic reflection-based approach.
|
||
|
*
|
||
|
* Note that with this approach there are no strongly-typed struct or class
|
||
|
* definitions to use from C -- this is essentially a reflection-based
|
||
|
* interface. Note that parsing and serializing are still very fast since
|
||
|
* they are JIT-based.
|
||
|
*
|
||
|
* If this seems a bit verbose, you may prefer an approach that generates
|
||
|
* strongly-typed struct definitions (upb will likely provide this, but it is
|
||
|
* not yet implemented).
|
||
|
*
|
||
|
* TODO: make this file compiled as part of "make examples"
|
||
|
* TODO: test that this actually works (WARNING: UNTESTED!)
|
||
|
*/
|
||
|
|
||
|
#include "upb/msg.h"
|
||
|
#include "upb/pb/glue.h"
|
||
|
|
||
|
const char *descfile = "example.proto.pb";
|
||
|
const char *type = "example.SampleMessage";
|
||
|
const char *msgfile = "sample_message.pb";
|
||
|
|
||
|
int main() {
|
||
|
// First we load the descriptor that describes the message into a upb_msgdef.
|
||
|
// This could come from a string that is compiled into the program or from a
|
||
|
// separate file as we do here. Since defs always live in a symtab, we
|
||
|
// create one of those also.
|
||
|
upb_symtab *s = upb_symtab_new();
|
||
|
upb_status status = UPB_STATUS_INIT;
|
||
|
if (!upb_load_descriptor_file_into_symtab(s, descfile, &status)) {
|
||
|
fprintf(stderr, "Couldn't load descriptor file '%s': %s\n", descfile,
|
||
|
upb_status_getstr(&status));
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
const upb_msgdef *md = upb_symtab_lookupmsg(s, type);
|
||
|
if (!md) {
|
||
|
fprintf(stderr, "Descriptor did not contain type '%s'\n", type);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// Parse a file into a new message object.
|
||
|
void *msg = upb_filetonewmsg(msgfile, md, &status);
|
||
|
if (!msg) {
|
||
|
fprintf(stderr, "Error parsing message file '%s': %s\n", msgfile,
|
||
|
upb_status_getstr(&status));
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// TODO: Inspect some fields.
|
||
|
return 0;
|
||
|
}
|