首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C# protobuf net序列化对象转换为java

将C# protobuf net序列化对象转换为java
EN

Stack Overflow用户
提问于 2013-04-08 12:45:56
回答 2查看 2.6K关注 0票数 1

所以我有个小问题:

消息是使用MQTT发送的,它由一系列使用C#中的protobuf的序列化对象组成(I不能修改这个代码,但我可以访问源代码)。另一方面,我收到Java中的序列化对象,问题是我似乎无法使用protobuf反序列化对象,如果有人遇到这个问题并解决了它,请帮助:)

C#中的对象示例:

代码语言:javascript
复制
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文件)中重新创建同一个对象:

代码语言:javascript
复制
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#中反序列化对象的代码:

代码语言:javascript
复制
var ms = new MemoryStream(data, 7, data.Length - 9)
var res = Serializer.Deserialize<List<MeterID>>(ms);

这在C#中有效,我试图在java中实现相同的功能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-08 12:50:26

C#代码中的消息与以下内容匹配:

代码语言:javascript
复制
message MeterID {
    optional bytes ID = 1;
    optional string MeterType = 2;
}

不需要2级模型(除非在*WithLengthPrefix代码中使用C# )。您还可以通过以下方法获得该输出:

代码语言:javascript
复制
var proto = Serializer.GetProto<MeterID>();

通过编辑,可以将List<MeterID>映射为

代码语言:javascript
复制
message List_MeterID {
    repeated MeterID items = 1;
}

要与前面的MeterID片段结合使用。这就是你的问题所在。因此,这归结为“目前发生了什么?”

票数 3
EN

Stack Overflow用户

发布于 2013-04-08 12:50:04

尝试通过GetProto<T>重新生成原始文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15879413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档