所以我有个小问题:
消息是使用MQTT发送的,它由一系列使用C#中的protobuf的序列化对象组成(I不能修改这个代码,但我可以访问源代码)。另一方面,我收到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中实现相同的功能。
发布于 2013-04-08 12:50:26
C#代码中的消息与以下内容匹配:
message MeterID {
optional bytes ID = 1;
optional string MeterType = 2;
}不需要2级模型(除非在*WithLengthPrefix代码中使用C# )。您还可以通过以下方法获得该输出:
var proto = Serializer.GetProto<MeterID>();通过编辑,可以将List<MeterID>映射为
message List_MeterID {
repeated MeterID items = 1;
}要与前面的MeterID片段结合使用。这就是你的问题所在。因此,这归结为“目前发生了什么?”
发布于 2013-04-08 12:50:04
尝试通过GetProto<T>重新生成原始文件。
https://stackoverflow.com/questions/15879413
复制相似问题