4

我在 MT 中发布了一条消息,它有几个对象类型的属性,因为我在编译时不知道类型。当我在消费者中收到消息时,我看到对象类型的属性填充了 Newtonsoft JObject 实例。JObject 类驻留在 Masstransit.dll 中的 ILMerged Newtonsoft.Json 程序集中。此程序集中的 JObject-Class 被标记为内部的。每当我尝试将属性值转换为由 Newtonsoft.Json 的 Nuget-Assembly 提供的 JObject 时,它都会失败。

所以我的问题是:

  • 将属性值转换为 JObject 的正确方法是什么?
  • 为什么演员会失败?这意味着,clr 在这里遇到的困难是什么?
  • 我可以在我的消费者中获得原始的、未序列化的消息体吗?

谢谢你。

4

3 回答 3

5

如果您在任何消息协定上进行运行时键入,则不能使用 JSON 序列化。如果你想这样做,你需要使用二进制序列化器。

您无法访问原始的、未序列化的消息体;如果消息无法反序列化,则不调用用户代码。

将任何类型标记为 internal 将不允许我们反序列化消息。无法调用构造函数,因此无法创建对象。我不确定二进制序列化程序是否可以让你绕过这个限制,而不是我测试过的东西。

如果您还有其他问题,也欢迎您加入邮件列表https://groups.google.com/forum/#!forum/masstransit-discuss

于 2012-02-06T17:43:32.380 回答
2

作为 MassTransit 的创造者之一,如果您包括

public object MyMessageProperty { get; set; }

在您的消息合同中,您做错了。利用框架的强类型发布功能,而不是在 MT 中的发布/订阅系统已经完成的调度之上进行自己的动态调度。

于 2012-02-07T14:19:35.930 回答
0

我上面描述的问题可能只是出于对我的消息传递系统的误解。但是我发现了一个讨厌的解决方法来将嵌套的 JObjects 转换为正确的域对象:

protected bool TryConvertJObjectToDtoOfType<T>(Object jObjectInDisguise, out T dto)
     where T: BpnDto
{
    try
    {
         if (jObjectInDisguise.GetType().Name != typeof(JObject).Name)
             throw new ArgumentException("Object isn't a JObject", "jObjectInDisguise");

        var json = jObjectInDisguise.ToString();
        var settings = new JsonSerializerSettings()
        {
            MissingMemberHandling = MissingMemberHandling.Error
        };

        dto = JsonConvert.DeserializeObject<T>(json, settings);
        return true;
    } catch
    {
        dto = null;
        return false;
    }
}
于 2012-02-07T09:40:42.583 回答