gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:48:07 24 4
gpt4 key购买 nike

所以我有一个小问题:

使用 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结合使用分段。这就是你在问题中所拥有的。所以它归结为“当前发生了什么?”。

关于C# protobuf-net 序列化对象到 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15879413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com