跨平台Protobuf序列化

时间:2015-03-16 12:08:53

标签: c# serialization protocol-buffers zeromq protobuf-net

我有三个通过ZeroMQ进行通信的应用程序都在执行不同的操作。不同的应用如下:

  1. 第一个是C ++应用程序,它是“努力工作”的引擎,它将Protobuf消息作为来自客户端的请求,做一些工作,并将Protobuf消息返回给该客户端(或任何人)连接,请求/回复模式)。这使用0MQ版本4.0.4并使用protobuf-2.6.0我们自己构建了所需的头文件,Protobuf类是由protoc创建的。

  2. 其次我有一个Java代码并且是一个数据提供者,它使用jeromq-0.3.4.jar用于ZeroMQ消息传递,使用protobuf-java-2.6.1.jar用于Protobuf序列化等。

  3. 第三,我有一个C#代码执行一些分析,并有一个很好的UI等。这使用Marc Gravell的protobuf-net(https://www.nuget.org/packages/protobuf-net/)作为NuGet包和NetMQ(ZeroMQ的本地C#端口)用于消息传递。

  4. 现在,C ++< - >但是,Java工作得很好而且没有问题,C ++< - > C#无法正常工作。当我通过

    将C#的基本请求发送到C ++“服务器”时
    using (NetMQContext context = NetMQContext.Create())
    using (var requestSocket = context.CreateRequestSocket())
    {
        requestSocket.Connect(_requestAddress); // "tcp://127.0.0.1:6500"
        requestSocket.Send(mux.ToByteArray<Taurus.FeedMux>());
    }
    

    public static byte[] ToByteArray<T>(this T o) 
        where T : ProtoBuf.IExtensible
    {
        if (o == null)
            return null;
        using (MemoryStream ms = new MemoryStream())
        {
            ProtoBuf.Serializer.Serialize(ms, o);
            return ms.ToArray();
        }
    }
    

    C ++代码接收消息但是尽管设置了强制

    Taurus.FeedMux mux = new Taurus.FeedMux();
    mux.type = Taurus.FeedMux.Type.OXX;
    mux.oxx = Oxx.GetOxx();
    

    我在C ++应用程序中遇到错误

      

    [libprotobuff ERROR .. \\ message_lite.cc:123]无法解析“Taurus.FeedMux”类型的消息,因为它缺少必填字段:type

    但我明确设置type并且在C ++代码中,似乎设置了类型(使用调试器来检查反序列化的对象)。我已经尝试了两个不同的Protobuf库(我通过NuGet构建了一个和Mark Gravell的库),因为我认为这是一个序列化问题,但这并不能解决这个问题。

    我还尝试了clrZMQ包装器库以及C#本机NetMQ库,再次这没有帮助,使用上述任意组合接收消息,但收到的似乎在某种程度上已损坏。

    这里可能出现什么问题,有什么我应该做的,我没有提到过吗?

1 个答案:

答案 0 :(得分:1)

我的猜测是type被视为optional,其中 - 在C ++中被标记为required。我无法在C#中看到您的模型是如何定义的,但如果您正在使用protobuf-net的属性,则可以强制它通过IsRequired属性成员进行序列化:< / p>

[ProtoMember(42, IsRequired = true)] // change the number!
public Taurus.FeedMux.Type type {get;set;}