use protobuf for marshalling