c# protobuf-net序列化对象到java
本文关键字:java 对象 序列化 protobuf-net | 更新日期: 2023-09-27 18:08:16
所以我有一个小问题:
使用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中实现同样的事情
您的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
片段结合使用。这就是你在问题中得到的。所以它归结为"当前发生了什么?"
尝试用GetProto<T>
重新生成proto-file