在C#中使用C ++ Protobuf实现
我在下面提到的C ++中创建了Protobuf文件。 我想在Protobuf-net中使用完全相同的。 它可以正常的Protobuf类正常工作,但我无法使用“MainMessage”中的扩展名来工作。 有人可以给我一些代码示例吗?
这里是我的C ++ .proto文件:
File - Messageheader.proto:
message MessageHeader{
required int32 Id = 1;
}
File - MainMessage.proto:
import "Messageheader.proto";
message MainMessage{
required MessageHeader Header = 1;
extensions 100 to 199;
}
File - MessageBool.proto:
import "Messageheader.proto";
import "MainMessage.proto";
message MessageBool{
required bool Successfull = 1;
optional string Information = 2;
extend MainMessage{
optional MessageBool Bool = 100;
}
}
File - MessageLogin.proto:
import "Messageheader.proto";
import "MainMessage.proto";
message MessageLogin{
required string Username = 1;
required string Password = 2;
extend MainMessage{
optional MessageLogin Login = 101;
}
}
C#程序将成为客户端,C ++程序将成为服务器。 所以protobuf的实现应该一起工作。
编辑:我试图发送一个MainMessage,其中包含一个MessageLogin从C#客户端到C ++服务器。 服务器可以反序列化成功的消息类型,因为标题ID可以被正确读取。 但是包含的MessageLogin只是空的。
你问我目前的尝试,这里是:
[删除旧的和错误的源代码。 现在我已经生成了.cs文件,这与cpp文件类似]
那么,我需要纠正什么,以便C#protobuf消息等于C ++呢?
EDIT2:该semms已经工作,但我仍然无法读取扩展登录消息。 序列化消息的当前方法:
//Create the Message
MainMessage message = new MainMessage
{
Header = new MessageHeader
{
Id = 1,
},
};
MessageLogin login = new MessageLogin
{
Username = username,
Password = password,
};
Extensible.AppendValue<MessageLogin>(message, 101, login);
string str = ProtoZmq.Serialize(message);
//another file:
public static string Serialize(object protobufMessage)
{
string str = "";
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, protobufMessage);
str = Encoding.ASCII.GetString(stream.GetBuffer());
//str = Convert.ToBase64String(stream.GetBuffer());
}
return str;
}
这就是我在C ++中反序列化的方式:
zmq::message_t request;
// Wait for next request from client
socket.recv(&request,0);
std::string rpl = std::string(static_cast<char*>(request.data()), request.size() - 1);
MainMessage message;
message.ParseFromString(rpl.data());
MessageLogin login = message.GetExtension(MessageLogin::Login);
std::string user = login.username();
std::string pw = login.password();
std::cout << message.header().id() << std::endl;
std::cout << user << std::endl;
std::cout << pw << std::endl;
C ++ Server总是告诉我这个消息没有扩展名,所以user和pw是空的。
链接地址: http://www.djcxy.com/p/42557.html上一篇: C++ Protobuf implementation in C#
下一篇: how to move an element into if it is contained in another element