1

所以我有一个小问题:

使用 MQTT 发送消息,它由一系列使用 C# 中的 protobuf-net 序列化的对象组成(我无法修改此代码,但我可以访问源代码)。在另一端,我收到了 Java 中的序列化对象,问题是我似乎无法使用 protobuf 反序列化对象,如果有人遇到过这个问题并解决了它,请帮助 :)

C# 中的对象示例:

using ProtoBuf;

namespace Concentrator.Services
{
[ProtoContract]
public class MeterID
{
    private byte[] _id;

    [ProtoMember(1)]
    public byte[] ID
    {
        get { return _id; }
        set { _id = value.Length == 16 ? value : null; }
    }

    [ProtoMember(2)] public string MeterType;
}
}

我尝试在 Java 中重新创建相同的对象(.proto 文件):

syntax = "proto2";

 package mqtt.entity;

 option java_package = "mqtt.entity";
 option java_outer_classname = "ProtoMeter";
 message Meter {
    optional bytes ID = 1;
     optional string MeterType = 2;
  }

  message MeterID {
     repeated Meter mid = 1;
 }

这个例子的解决方案将是一个巨大的帮助,非常感谢。

在 C# 中反序列化对象的代码:

var ms = new MemoryStream(data, 7, data.Length - 9)
var res = Serializer.Deserialize<List<MeterID>>(ms);

这在 C# 中有效,我正在尝试在 java 中实现相同的目标

4

2 回答 2

3

您的 C# 代码中的消息仅匹配:

message MeterID {
    optional bytes ID = 1;
    optional string MeterType = 2;
}

不需要 2 级模型(除非您*WithLengthPrefix在 C# 代码中使用)。您还可以使用以下方法获取该输出:

var proto = Serializer.GetProto<MeterID>();

通过您的编辑, aList<MeterID>可以映射为

message List_MeterID {
    repeated MeterID items = 1;
}

与前一个片段结合使用MeterID这就是你的问题。所以归结为“目前发生了什么?”。

于 2013-04-08T12:50:26.577 回答
1

尝试通过重新生成原始文件GetProto<T>

于 2013-04-08T12:50:04.683 回答