如何使用protobuf对多个可区分项目进行背靠背编码
How to encode multiple distinguishable items back to back with protobuf?
因此,我进行了一个单元测试,试图确保编码和解码是正确的。基本上,我希望能够将多个不同的C++对象序列化为一个字符串,然后将该字符串写入一个文件。这就是我目前所拥有的:
这是我的.proto文件:
message Register {
required string regname = 1;
required uint64 regvalue = 2;
}
message RegisterContext {
repeated Register elem = 1;
}
message MemoryRegion {
repeated bytes elem = 1;
}
message Image {
required string imgName = 1;
required MemoryRegion Memory = 2;
required uint64 MemStart = 3;
required uint64 MemEnd = 4;
required bool isMain = 5;
}
message MemoryRegions {
repeated Image elem = 1;
}
message MemoryDump {
required RegisterContext context = 1;
required MemoryRegions state = 2;
}
我有语言白话风格的表示对象,可以帮助我像平时一样使用它们:
//name, value
using reg=std::tuple<std::string, uint64_t>;
using reg_context=std::list<reg >;
using mem_region=std::string;
//name, memory, start, end, ismain
using image=std::tuple<std::string, mem_region, uint64_t, uint64_t, bool>;
using mem_region_set=std::list<image >;
using memory_dump=std::tuple<reg_context, mem_region_set>;
以下是失败的测试:
TEST(SerializationTests, test_contiguous_memory_differentiated) {
mem_region region="x25x26x27";
image i1{std::make_tuple(std::string("img1"), region, 0, 1, false)},
i2{std::make_tuple(std::string("img2"), region+"x28", 0, 1, false)},
i3{std::make_tuple(std::string("img3"), region+"x29", 0, 1, false)};
mem_region_set regions1{i1, i2, i3}, regions2{i1, i3};
auto serialized_regions1=serialize_memory_regions(regions1);
auto serialized_regions2=serialize_memory_regions(regions2);
std::stringstream ss;
ss << *serialized_regions1 << *serialized_regions2;
auto concatenated=ss.str();
auto deserialized_region1=unpack_memory_regions(concatenated);
ASSERT_EQ(deserialized_region1, regions1);
auto deserialized_region2=unpack_memory_regions(concatenated);
ASSERT_EQ(deserialized_region2, regions2);
}
如何序列化多个对象,以便无论我将它们放入字符串流还是ofstream,它们都会作为distict返回我在这里运行的测试结果是反序列化区域1/2,每个区域总共有5个图像,只有i1、i2、i3、i1、i3
一种可能的方法是在每个protobuf对象之前写入固定的32字节整数。当你需要用多个对象解析缓冲区或文件时,你可以先读取消息长度,然后读取length
字节长的消息体并进行解析。例如,你的消息MemoryDump
将被编译为class MemoryDump
。你可以这样包装:
MemoryDump memoryDump;
fillData(memoryDump); // put data in it somehow
auto size = memoryDump.ByteSize(); // return space that it needs to be packed
std::string buffer;
StringOutputStream stream(&buffer);
CodedOutputStream coded(&stream);
coded.WriteLittleEndian32(size);
memoryDump.SerializeToCodedStream(&coded);
coded.WriteLittleEndian32(size);
memoryDump.SerializeToCodedStream(&coded);
然后当你打开数据包时,你可以做:
MemoryDump memoryDump1;
MemoryDump memoryDump2;
std::string buffer;
readBuffer(buffer);
StringInputStream stream(&buffer);
CodedInputStream coded(&stream);
int size;
coded.ReadLittleEndian32(&size);
memoryDump1.ParseFromBoundedZeroCopyStream(&stream, size);
coded.ReadLittleEndian32(&size);
memoryDump1.ParseFromBoundedZeroCopyStream(&stream, size);
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 如何使用protobuf对多个可区分项目进行背靠背编码