所以我有一个小问题:
使用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中实现相同的东西
答案 0 :(得分:3)
C#代码中的消息只匹配:
message MeterID {
optional bytes ID = 1;
optional string MeterType = 2;
}
不需要2级模型(除非您在C#代码中使用*WithLengthPrefix
)。您还可以使用以下方法获取该输出:
var proto = Serializer.GetProto<MeterID>();
通过编辑,List<MeterID>
可以映射为
message List_MeterID {
repeated MeterID items = 1;
}
将与之前的MeterID
片段结合使用。这就是你在问题中的含义。所以它归结为“目前发生了什么?”。
答案 1 :(得分:1)
尝试按GetProto<T>