Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#protobuf net序列化对象到java_C#_Java_Serialization_Protocol Buffers_Protobuf Net - Fatal编程技术网

C#protobuf net序列化对象到java

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,数据长

所以我有一个小问题:

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

来自C#的对象示例:

我尝试在Java中重新创建同一对象(proto文件):

这个例子的解决方案将是一个巨大的帮助,非常感谢

在C#中反序列化对象的代码:

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不同,它现在可以完美地工作。非常感谢。请更具体一点,我以前从未使用过protobuf
var res=Serializer.GetProto并使用
res
Ok在C语言中实现这一点,这是一个很好的步骤,但是如何在java中导出它呢@cdanisor与大多数代码相比,
GetProto
的重新实现相对较新-我认为它可以处理大多数情况,但如果您遇到任何问题,请让我知道更具体一点,我以前从未使用过protobuf
var res=Serializer.GetProto并使用
res
Ok在C语言中实现这一点,这是一个很好的步骤,但是如何在java中导出它呢@cdanisor与大多数代码相比,
GetProto
的重新实现相对较新,我认为它可以处理大多数情况,但是如果您遇到任何问题,请告诉我
var proto = Serializer.GetProto<MeterID>();
message List_MeterID {
    repeated MeterID items = 1;
}