C#protobuf-net序列化对象到java

时间:2013-04-08 12:45:56

标签: c# java serialization protocol-buffers protobuf-net

所以我有一个小问题:

使用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中实现相同的东西

2 个答案:

答案 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>

重新生成原始文件