首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用nodejs上的protobufjs来自.net的protobuf消息时,无效的导线类型和超出范围的错误索引

当使用nodejs上的protobufjs来自.net的protobuf消息时,无效的导线类型和超出范围的错误索引
EN

Stack Overflow用户
提问于 2020-06-22 11:15:07
回答 1查看 5.6K关注 0票数 2

我试图在节点js上使用来自RMQ的protobuf消息。原型消息是在C#.Net上用protobuf-net创建的。

例如,c#对象如下所示:

代码语言:javascript
复制
    [ProtoContract]
    public class PositionOpenNotification : MessageBase
    {
    [ProtoMember(1)]
    public int PositionID { get; set; }

    [ProtoMember(2)]
    public int InstrumentID { get; set; }
    ..
    ..Down to tag 30

然后将其添加到RMQ中,并在另一端有具有相同对象的.net侦听器来对其进行解码。

但是现在我们想读一下nodejs的消息。为此,我在nodejs端使用amqplib和protobuf。

我试图使用这样的带有装饰器的对象来解码消息:

代码语言:javascript
复制
import { Message, Type, Field } from "protobufjs/light"; 
 
 @Type.d("PositionOpenNotification")
 export class PositionOpenNotification extends Message<PositionOpenNotification> {
 
  @Field.d(1,"int32", "required")
  public PositionID: number;
}

像这样解码:

代码语言:javascript
复制
ch.consume(q.queue, function(msg, res) {
            try {
                if(msg.content) {
                    let decoded = PositionOpenNotification.decode( msg.content);
                    console.log(" Received %s", decoded,q.queue);
                }
              } catch (e) {
                 console.log("Error  %s ", e.message)
              }
        }

其中ch是amqplib RMQ信道。

但我总是会犯这样的错误:

偏移量2处的无效线类型7

4型线在偏移量2处无效

错距2处的6型无效导线

超出范围的指数: 237 + 10 > 237

我做错了什么?

编辑:

看起来,我没有考虑到MessageBase( PositionOpenNotification继承的抽象)也是ProtoContract,而且数据是用length前缀序列化的。

最后,这才是起作用的原因:

添加一个MessageBase对象,其中包含PositionOpenNotification对象:

代码语言:javascript
复制
@Type.d("MessageBase")
export class MessageBase extends Message<MessageBase> {

  @Field.d(108, PositionOpenNotification)
  public positionOpenNotification: PositionOpenNotification;
}

然后在反序列化的时候:

代码语言:javascript
复制
 if(msg.content) {
    var reader = Reader.create(msg.content);
    let decoded = MessageBase.decodeDelimited(reader);
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-22 15:41:35

电线类型7不存在,因此:错误是正确的,至少。

这种类型的错误通常表示有效载荷在传输过程中已损坏。最常见的方法是将其视为文本和/或(非常经常看到的内容):通过向后编码来通过文本协议传输二进制数据。检查一下你没有这么做。基本上,你需要在两端得到完全相同的字节;直到你有了这个字节,其他的才能工作。特别是,如果您需要通过文本协议传输二进制文件: base-64是您的朋友。

顺便提一句:protobuf有为对象模型导出.proto模式的方法,以使x-plat更方便。去找Serializer.GetProto<T>

如果有一个不能确定的有效负载,则可以使用https://protogen.marcgravell.com/decode验证和检查二进制数据。

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

https://stackoverflow.com/questions/62513177

复制
相关文章

相似问题

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