首页 > 解决方案 > RabbitMQ/C# 消息序列化

问题描述

嘿,我在通过 newtonsoft 和 rabbitMQ 序列化我的 POCO 时遇到了一些问题,它们都实现了 IMessage 接口,但是 POCO 本身并不在应用程序之间共享,总而言之,我有一个 IMessage 接口和两个 Message : IMessage 类,每个项目一个,但是它们具有相同的结构,这就是为什么我想知道为什么 newtonsoft 不能序列化它们。

顺便说一句,我试图遵循一些人https://github.com/devmentors在这里开发的内容。

图案看起来像这样

pub 发布 UserCreated -> rabbitmq 总线 -> 订阅者接收 UserCreated 但 UserCreated 是两个不同的类,它们都实现了 IEvent 或其他一些标记接口

订户

using System;
using Core;
using Newtonsoft.Json;
using RawRabbit.vNext;

namespace Not
{
    class Sub
    {
        public void Subscribe<TMessage>() where TMessage : IMessage
        {
            var client = BusClientFactory.CreateDefault();
            client.SubscribeAsync<TMessage>(async (message, ctx) =>
                {
                    Console.WriteLine(typeof(Message));
                    Console.WriteLine(message);
                },
                c =>
                {
                    c.WithExchange(q => { q.WithName(typeof(Message).Name); });
                    c.WithRoutingKey("example");
                });
        }
    }
    class Message : IMessage
    {
        [JsonConstructor]
        public Message(string body)
        {
            Body = body;
        }

        public string Body { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Sub");
            var sub = new Sub();
            sub.Subscribe<Message>();
            Console.ReadLine();
        }
    }
}

和我的出版商

using System;
using Core;
using Newtonsoft.Json;
using RawRabbit.vNext;

namespace Acceptable
{

    public class Message : IMessage
    {
        public string Body { get; set; }

        [JsonConstructor]
        public Message(string body)
        {
            Body = body;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Pub");
            var client = BusClientFactory.CreateDefault();
            while (true)
            {
                var input = Console.ReadLine();
                var message = new Message(input);
                client.PublishAsync(message, configuration: c =>
                {
                    c.WithRoutingKey(typeof(Message).Name);
                    c.WithExchange(e => e.WithName(typeof(Message).Name));
                });
            }
        }
    }
}

目前我收到此错误https://i.imgur.com/hvHiXWw.png

'JSON 中指定的类型'Acceptable.Message, Acceptable, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 与'Not.Message, Not, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'不兼容'。路径'$type',第 1 行,位置 51。

而且我不知道为什么它们不兼容,它们都实现了 IMessage 并具有相同的道具。

标签: .netrabbitmqmessage-queuebusrawrabbit

解决方案


推荐阅读