protobuf:对套接字进行连续序列化和反序列化
protobuf: consecutive serialize and deserialize to/from socket
在将消息序列化到套接字(SerializeToFileDescritor)后,我在C++客户端和C#服务器之间的简单通信陷入停滞。
C++客户端:
Person person;
person.set_id(54321);
person.set_name("bla");
person.mutable_address()->set_line1("sdfa");
person.mutable_address()->set_line2("asdfsdfa");
cout << person.id() << endl << person.name() << endl;
cout << person.address().line2() << endl;
person.SerializeToFileDescriptor(s);
ZeroCopyInputStream* raw_input = new FileInputStream(s);
CodedInputStream* coded_input = new CodedInputStream(raw_input);
Person person2;
person2.ParseFromFileDescriptor(s);
cout << person2.id() << endl << person2.name() << endl;
cout << person2.address().line2() << endl;
C#服务器
var sockServer = new TcpListener(2048);
sockServer.Start();
var person = new Person { Id = 123456, Name = "Fred", Address = new Address { Line1 = "Flat 1", Line2 = "The Meadows ar garą " } };
var socket = sockServer.AcceptSocket();
Stream str = new NetworkStream(socket);
var response = Serializer.Deserialize<Person>(str);
Console.WriteLine(response.Id);
Serializer.Serialize(str, person);
在我看来,这太愚蠢了——它不起作用。
如果我删除其中任何一个:person。SerializeToFileDescriptor或person2.ParseFromFileDescriptor,另一个会起作用。
我该怎么做才能让它们同时工作?
根对象的默认行为是消耗流末尾的所有数据。既然你不关闭这条小溪,那末就永远不会到来。
如果你的意图是将多个对象发送到同一个套接字(这很正常),那么你需要给它一个线索。最常见的方法是在每条消息前面加上将要发送的数据的长度。这可以是固定的-32 int,如果方便的话,也可以是可变的。然后你可以在消费者那里阅读。
然后你如何处理取决于打电话的人;protobuf网络有一个DeserializeWithLengthPrefix
,它将处理各种形式的编码,无论是否有额外的字段标记(在varint的情况下,使其成为有效的protobuf流)。例如:
Person person = Serializer.DeserializeWithLengthPrefix<Person>(str,
PrefixStyle.Fixed32, 0);
如果您打算发送多条消息,这可能会很有用。
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- protobuf:对套接字进行连续序列化和反序列化