Как сериализовать в .NET MessagePack и десериализовать в Node.js

#c# #node.js #msgpack #lz4

#c# #node.js #msgpack #lz4

Вопрос:

У меня есть очередь RabbitMQ и два приложения. Первое приложение написано на .NET Core для генерации отправки полезной нагрузки в очередь, а второе — в Node.js для чтения из очереди.

Приложение-производитель

Я использую MessagePack-CSharp для сериализации и сжатия (LZ4) полезной нагрузки. Вот код сериализации в .NET:

 using MessagePack;

namespace uBeac.Serialization
{
    public class MessageSerilizer
    {
        public static byte[] Serialize(object message)
        {
            MessagePackSerializer.SetDefaultResolver(MessagePack.Resolvers.ContractlessStandardResolver.Instance);
            return LZ4MessagePackSerializer.Serialize(message);
        }
    }
}
  

Потребительское приложение

Я считываю байты в Node.js используя библиотеку amqplib, как показано ниже:

 var amqp = require('amqplib/callback_api');

amqp.connect('amqp://...................', function (err, conn) {
    conn.createChannel(function (err, ch) {
        var queueName = 'toProcessor';
        ch.assertQueue(queueName, { durable: false });
        ch.prefetch(1);
        console.log(" [*] Waiting for messages in %s. To exit press CTRL C", queueName);
        ch.consume(queueName, function (msg) {
            var secs = msg.content.toString().split('.').length - 1;
            console.log(" [x] Received %s", msg.content.toString());
            setTimeout(function () {
                console.log(" [x] Done");
                ch.ack(msg);
            }, secs * 1000);
        }, { noAck: false });
    });
});
  

Я попытался десериализовать полезную нагрузку в объект Json, используя некоторые библиотеки MsgPack, такие как messagepack, msgpack-node, … Но, похоже, что они не предоставляют ту же библиотеку в .NET, что я показал выше.

Вопрос: Как я могу распаковать и десериализовать полезную нагрузку в объект Json?

Комментарии:

1. Если вы сжимаете LZ4 в виде двоичного потока , что заставляет вас думать, что вы можете десериализовать его с помощью библиотеки JSON ?

2. @MickyD Я пытался сделать так, чтобы с помощью #lz4js: lz4.распаковывать (msg.content) , но это выдает throw er; // Необработанное событие ‘error’

3. Тогда, может быть, лучше исправить эту ошибку , чем пытаться что-то, что может вообще не сработать?

4. Ваша Producer явно сериализуется в двоичном формате, а ваша Consumer десериализуется в виде строки . Это не сработает. Мой совет — следовать общим рекомендациям по обмену корпоративными сообщениями и сохранять содержимое вашего сообщения в виде, text а не двоичном формате, поэтому никакого явного ручного сжатия содержимого. Двоичное кодирование накладывает определенные ограничения на получателя и уменьшает вашу аудиторию, не говоря уже о том, что вы, скорее всего, разобьете потребителей будущими изменениями. Теперь, если это так, text вы не привязаны к какому-либо одному поставщику для кодирования / декодирования объектов.

5. Сериализовать как text . Является ли это XML; JSON или что-то еще, зависит от вас