C#protobuf net序列化对象到java
所以我有一个小问题: 消息使用MQTT发送,它由一系列使用C#中protobuf net的序列化对象组成(我无法修改此代码,但我可以访问源代码)。在另一端,我收到了Java中的序列化对象,问题是我似乎无法使用protobuf反序列化对象,如果有人遇到过这个问题并解决了,请帮助:) 来自C#的对象示例: 我尝试在Java中重新创建同一对象(proto文件): 这个例子的解决方案将是一个巨大的帮助,非常感谢 在C#中反序列化对象的代码:C#protobuf net序列化对象到java,c#,java,serialization,protocol-buffers,protobuf-net,C#,Java,Serialization,Protocol Buffers,Protobuf Net,所以我有一个小问题: 消息使用MQTT发送,它由一系列使用C#中protobuf net的序列化对象组成(我无法修改此代码,但我可以访问源代码)。在另一端,我收到了Java中的序列化对象,问题是我似乎无法使用protobuf反序列化对象,如果有人遇到过这个问题并解决了,请帮助:) 来自C#的对象示例: 我尝试在Java中重新创建同一对象(proto文件): 这个例子的解决方案将是一个巨大的帮助,非常感谢 在C#中反序列化对象的代码: var ms=newmemoryStream(数据,7,数据长
var ms=newmemoryStream(数据,7,数据长度-9)
var res=序列化程序。反序列化(ms);
这在C#中起作用,我正试图在java中实现同样的效果尝试通过
GetProto重新生成proto文件GetProto尝试通过GetProto重新生成proto文件您的C#代码中的消息只匹配:
message MeterID {
optional bytes ID = 1;
optional string MeterType = 2;
}
不需要两级模型(除非您在C代码中使用带长度前缀的*
)。您还可以通过以下方式获得该输出:
var proto = Serializer.GetProto<MeterID>();
与前面的MeterID
片段结合使用。这就是你在问题中所说的。因此,它归结为“当前发生了什么?”。您的C代码中的消息只匹配:
message MeterID {
optional bytes ID = 1;
optional string MeterType = 2;
}
不需要两级模型(除非您在C代码中使用带长度前缀的*
)。您还可以通过以下方式获得该输出:
var proto = Serializer.GetProto<MeterID>();
与前面的MeterID
片段结合使用。这就是你在问题中所说的。所以归结到“当前发生了什么?”。您说“我似乎无法对对象进行反序列化”,但当您尝试时会发生什么?编译错误?运行时错误?数据损坏?尝试反序列化时验证错误您说“我似乎无法反序列化对象”,但尝试时会发生什么?编译错误?运行时错误?数据损坏?验证尝试反序列化时出错我正在尝试用java进行反序列化,对象在一个列表中,我将更新第一篇文章,在C#@cdanisor中添加反序列化代码,或者您没有提到列表
:p因此,您原始问题中的.proto就可以了。这就引出了一个问题——现在发生了什么?什么不起作用?你有例外吗。。。?或者…?现在还有另一个问题:)线程“MQTT客户端回调”java.lang.VerifyError中的异常:类MQTT.entity.ProtoMeter$MeterID覆盖最终方法getUnknownFields。()Lcom/google/protobuf/UnknownFieldSet;在java.lang.ClassLoader.defineClass1(本机方法)中,protoc生成的类似乎有错误,它覆盖了最后一个方法。@cdanisor首先检查您是否拥有google protobuf(非protobuf net)包的当前版本;如果protoc
仍然发出非法的java,那么我建议在protobuf(而不是protobuf-net)上报告它。你是对的,我使用了一个错误的protoc版本,与jar不同,它现在可以完美地工作。非常感谢。我正在尝试用java进行反序列化,对象在一个列表中,我将更新第一篇文章,在C#@cdanisor中添加反序列化的代码,或者您没有提到列表
:p那么,您原始问题中的.proto就可以了。这就引出了一个问题——现在发生了什么?什么不起作用?你有例外吗。。。?或者…?现在还有另一个问题:)线程“MQTT客户端回调”java.lang.VerifyError中的异常:类MQTT.entity.ProtoMeter$MeterID覆盖最终方法getUnknownFields。()Lcom/google/protobuf/UnknownFieldSet;在java.lang.ClassLoader.defineClass1(本机方法)中,protoc生成的类似乎有错误,它覆盖了最后一个方法。@cdanisor首先检查您是否拥有google protobuf(非protobuf net)包的当前版本;如果protoc
仍然发出非法的java,那么我建议在protobuf(而不是protobuf-net)上报告它。你是对的,我使用了一个错误的protoc版本,与jar不同,它现在可以完美地工作。非常感谢。请更具体一点,我以前从未使用过protobufvar res=Serializer.GetProto代码>并使用res
Ok在C语言中实现这一点,这是一个很好的步骤,但是如何在java中导出它呢@cdanisor与大多数代码相比,GetProto
的重新实现相对较新-我认为它可以处理大多数情况,但如果您遇到任何问题,请让我知道更具体一点,我以前从未使用过protobufvar res=Serializer.GetProto代码>并使用res
Ok在C语言中实现这一点,这是一个很好的步骤,但是如何在java中导出它呢@cdanisor与大多数代码相比,GetProto
的重新实现相对较新,我认为它可以处理大多数情况,但是如果您遇到任何问题,请告诉我
var proto = Serializer.GetProto<MeterID>();
message List_MeterID {
repeated MeterID items = 1;
}