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# protobuf-net序列化对象到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