-2

我有一个围绕代理设计的系统,这样我的生产者使用 Java,消费者使用 Go。

我正在使用 apache-pulsar 作为我的经纪人

Java - 生产者

MessageJava 类在发送到 pulsar 之前转换为字节数组:MessageJava 类的对象调用同一类中定义的getBytes()方法将其转换为 byte[],然后将该数组发送到 apache-pulsar

class MessageJava {
  String   id;
  int      entityId;
  Date     timestamp;

  public byte[] getBytes() throws Exception{
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(this);
    oos.flush();
    return bos.toByteArray();
  }
}

我的消费者是用 Go 编写的。

去 - 消费者

从 pulsar 读取字节数组并使用 ConvertAfterReceiving 方法 [定义如下] 转换为 MessageGo 结构,我使用gob进行解码

type MessageGo struct {
    Id            string
    EntityId      int
    Timestamp     time.Time
}

func ConvertAfterReceiving(msg pulsar.Message) *MessageGo {
    payload := msg.Payload()
    messageBytes := bytes.NewBuffer(payload)
    dec := gob.NewDecoder(messageBytes)

    var message MessageGo
    err := dec.Decode(&message)
    if err != nil {
        logging.Log.Error("error occurred in consumer while decoding message:", err)
    }
    return &message
}

问题是我无法解码 byte[] 并将其转换为 MessageGo 结构。它显示错误编码的无符号整数超出范围

我尝试将 MessageJava.entityId 更改为 short/long 并将 MessageGo.EntityId 更改为 int8/int16/int32/int64/uint8/uint16/uint32/uint64 [所有排列],但都是徒劳的。

4

1 回答 1

1

JavaObjectOutputStream和 GoDecoder说的不是同一种语言,即使它们在基础上都是由字节组成的;就像“这些词”和“эти слова”是由线条组成的,但知道一个并不会让你知道另一个。

AnObjectOutputStream将对象转换为 Java 可以读取的形式ObjectInputStream,而 GoDecoder需要 Go 创建的格式的数据Encoder

需要的是一种他们都说的像 JSON 一样的语言,JavaGo都知道如何使用它。然后,不是将对象直接序列化为字节,而是将其转换为字符串表示形式,发送该字符串的字节并将 Go 中的该字符串转换为所需的结构。

于 2020-04-10T13:33:10.260 回答