- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 protobuf-net 序列化了数据,并且能够在 C# 中进行相同的处理。
var file = File.Create("animal.bin");
//Creating Msg - Fill the Data
animal.id = "1";
animal.Name = "Rat";
animal.host = "Cheetha";
ProtoBuf.Serializer.SerializeWithLengthPrefix(file, animal, PrefixStyle.Base128, 1);
animal.id = "2";
animal.Name = "Cat";
animal.host = "Cheetha";
ProtoBuf.Serializer.SerializeWithLengthPrefix(file, animal, PrefixStyle.Base128, 1);
....
animal.id = "4";
animal.name = "Cheetha";
animal.host = "Cheetha";
ProtoBuf.Serializer.SerializeWithLengthPrefix(file, animal, PrefixStyle.Base128, 1);
//Done Creating Msg
file.Close();
到目前为止一切顺利...这里没有问题。但是当我尝试使用 Protocol Buffer 在 C++ 中反序列化相同内容时,我无法获得正确的数据
GOOGLE_PROTOBUF_VERIFY_VERSION;
string fpath = "animal.bin";
fstream input(fpath, ios::in | ios::binary);
if (!input)
{
cerr << "failed to open " << fpath << endl;
return false;
}
ZeroCopyInputStream *raw_in = new IstreamInputStream(&input);
CodedInputStream *coded_in = new CodedInputStream(raw_in);
google::protobuf::uint32 n;
std::string tmpStr;
animal::animalInfo animalList;
coded_in->ReadVarint32(&n);
cout << "# " << n << endl; //output: #10
coded_in->ReadRaw(&tmpStr,n); //tmpStr shows data like >>1..Rat..Ch
animalList.ParseFromArray(&tmpStr,1);//Not sure if this is correct usage?
我确定我犯了一个错误,但无法理解哪里出了问题......已经阅读并重读了很多关于此的帖子,但看不出还有什么问题
使用 Protocol Buffer2.5、protobuf-netR622、Visual Studio 2010
最佳答案
我认为您只是不匹配 header ;长度前缀和字段 header (字段 1)是两个“varint”; 第一个“varint”将始终是十进制的 10(10 表示:字段 1,长度前缀)。 第二个“varint”告诉您下一个数据的长度。所以 - 如果您想手动解码它,您可以第二次调用ReadVarint32
。我不熟悉ReadRaw
,但是如果第二个参数是要读取的字节数,那么它就在那里,即
coded_in->ReadVarint32(&n); // field header
// assert: n === 10
coded_in->ReadVarint32(&n); // length
coded_in->ReadRaw(&tmpStr,n);
或者,只需使用包装器对象 - 即
message animals {
repeated animal items = 1;
}
并将其反序列化作为animals
的实例 - 这使用完全相同的布局。这里唯一的区别是它会一次性加载所有项目——所以如果你正在阅读很长的流,它可能会有问题。
另一种选择是:不添加字段标题:
Serializer.SerializeWithLengthPrefix(file, animal, PrefixStyle.Base128, 0);
那么你只会读到一个“varint”:
coded_in->ReadVarint32(&n); // length
coded_in->ReadRaw(&tmpStr,n);
关于c# - 使用 protobuf-net 发布反序列化 (protocolBuffer) 序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473083/
我正在尝试在 visual studio 2015 中调试 app_engine 项目。到目前为止,我有这些行: 我安装了 pip:端点、protopc、appengine 和 google-api-
我有一个 OrderList 类型的 protobuf 消息 message OrderList { repeated Order orders = 1; } 我想将这个订单列表传递到我编写的自定
我正在尝试使用 Google 的 ProtocolBuffer 在服务器/客户端架构中发送/接收数据。我能够将两者与 winsock 连接起来,并且能够使用它从 ProtocolBuffer 发送和接
我想知道如何检索从字节加载的 protobuf 的类型。 例如: Worklist work = Worklist.newBuilder().build(); byte[] msg = work.to
是否可以以 ProtocolBuffer 格式在 BigQuery 中导入数据?我已经有一个(非常)大的数据集采用这种格式,现在我想将它们推送到 BigQuery。但如果我能避免翻译成 json 左右
嗨,我是一名中国 iOS 工程师。 我正在尝试在 iPhone 上运行 Protocol Buffer ,我下载了 metasyntactic project来自谷歌代码,并按照您的介绍进行操作。 但
我最近升级了我的代码库(Java、C++ 和 C#)以使用 proto3。就 C# 而言,这涉及对代码的 2000 多次更改。这主要是语义上的,而且一切都很好,但有一个问题我似乎无法理解;序列化/反序
我从我通常使用的原型(prototype)类创建了一个 ProtocolBuffer 对象,我需要将它序列化。现在,我获取该对象并对其调用 SerializeToArray(),如下所示: int s
从事宠物项目(cassandra、spark、hadoop、kafka)我需要一个数据序列化框架。查看常见的三个框架 - 即 Thrift、Avro 和 Protocolbuffers - 我注意到它
我们最近才在 out 平台中采用 ProtocolBuffers,并且我在 v3 中看到了 FieldMasks 的引入,但我们似乎无法弄清楚如何使用它们。 我们已经使用 v3 编译器生成了我们的 p
我正在编写一个程序,该程序应该通过 ZeroMQ 发送 C 结构。因此,我使用 Google 的 ProtocolBuffers 来序列化结构。 我现在遇到的问题是我的订户端没有收到任何内容。发布者打
我有这段代码,它在升级 GAE Python NDB 之前可以工作: class MyHandler(webapp2.RequestHandler): def get(self,urlString
我使用 protobuf-net 序列化了数据,并且能够在 C# 中进行相同的处理。 放置一个 C# 虚拟 w# var file = File.Create("animal.bin"); //Cre
我开始将自定义序列化机制迁移到 Protocol Buffer 。一种特别经常使用的数据类型是 BigDecimal。 有谁知道在 Protocol Buffer 中序列化它的好方法吗?我们当前的序列
我是一名优秀的程序员,十分优秀!