> For the complete documentation index, see [llms.txt](https://ref.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ref.gitbook.io/notes/protobuf.md).

# Protobuf

Convert `stuff.proto` to `stuff.proto.jar` , open bash shell and run:

```bash
protoc -I=proto/ --java_out=build/protogen/ proto/stuff.proto
javac -cp jars/protobuf-java-3.11.4.jar build/protogen/org/stuff/proto/*.java
jar cvf build/stuff.proto.jar -C build/protogen/ org
```

Needed executables: `protoc`, `javac` and `jar`

Check `protoc --version` is compatible to `protobuf-java` jar.

Illustrative example:

```cpp
void kv_pair_test()
{
    idpass::Dictionary d;
    idpass::Pair* p = d.add_pairs();
    p->set_key("gender");
    p->set_value("male");

    idpass::Pair q;
    q.set_key("color");
    q.set_value("red");

    d.mutable_pairs()->AddAllocated(&q);
    int buf_len = d.ByteSizeLong();
    std::cout << buf_len;
    unsigned char* buf = new unsigned char[buf_len];
    d.SerializeToArray(buf, buf_len);

    std::cout << buf;
    idpass::Dictionary dd;
    assert(dd.ParseFromArray(buf, buf_len) == true);
    for (auto p : dd.pairs()) {
        std::cout << p.key(); 
        std::cout << p.value(); 
    }

    delete[] buf;
}

```
