在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