Конвертировать java байтовый массив в Go struct - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть система, созданная вокруг брокера, так что мой производитель находится в Java, а потребитель в Go.

Я использую apache -пульсар в качестве моего брокера

Java - Производитель

Класс сообщения Java преобразуется в байтовый массив перед отправкой его в pulsar : объект класса Message Java вызывает 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.

Go - Потребительский

байтовый массив считывается из пульсара и преобразуется в структуру Message Go с использованием метода ConvertAfterReceiving [определено ниже], я использую 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
}

Проблема в том, что я не могу декодировать байт [] и преобразовать его в структуру Message Go. Он показывает ошибку закодированное целое число без знака вне диапазона

Я попытался изменить Message Java .entityId на short / long и Message Go .EntityId на int8 / int16 / int32 / int64 / uint8 / uint16 / uint32 / uint64 [все перестановки], но все напрасно.

1 Ответ

1 голос
/ 10 апреля 2020

A Java ObjectOutputStream и Go Decoder не говорят на одном языке, даже если в основе они оба состоят из байтов; так же, как «эти слова» и «эти слова» состоят из строк, но знание одного не дает вам знать другого.

ObjectOutputStream преобразует объекты в форму, предназначенную для чтения Java ObjectInputStream, а Go Decoder ожидает данные в формате, созданном Go Encoder.

. Необходим язык, на котором они оба говорят как JSON с которыми Java и Go умеют работать. Затем вместо сериализации объекта в байты вы преобразуете его в строковое представление, отправляете байты этой строки и преобразуете эту строку в Go в желаемую структуру.

...