Сложное сообщение и массовая де-сериализация


Я публикую сообщение в MT, которое имеет несколько свойств типа объекта, так как я не знаю тип во время компиляции. Когда я получаю сообщение в приемнике, я вижу, что типизированные свойства объекта заполнены экземплярами Newtonsoft JObject. Класс JObject находится в ILMerged Newtonsoft.В JSON-сборка в широкие.файл DLL. Класс JObject в этой сборке помечен как внутренний. Всякий раз, когда я пытаюсь привести значение свойства к JObject, предоставляемому NuGet-сборкой Newtonsoft.формат JSON он терпит неудачу.

Итак, мои вопросы:

  • Как правильно привести значение свойства к JObject?
  • Почему актерский состав терпит неудачу? Это означает, что какие трудности есть у clr здесь?
  • я могу получить сырье, тело сообщения необходимо выполнить десериализацию в моих потребителей?

Спасибо.

3 4

3 ответа:

Нельзя использовать сериализацию JSON, если выполняется набор текста во время выполнения для любых контрактов сообщений. Если вы хотите сделать это, вам потребуется использовать двоичный сериализатор.

Вы не можете получить доступ к необработанному несериализованному телу сообщения; если сообщение не может быть десериализовано, то пользовательский код не вызывается.

Наличие каких-либо типов, помеченных как внутренние, не позволит нам десериализовать сообщение. Конструктор не может быть вызван, следовательно, не может быть создан объект. Я не уверен, что двоичный сериализатор будет позвольте вам обойти это ограничение, а не то, что я проверил.

Если у вас есть другие вопросы, вы также можете присоединиться к списку рассылки, https://groups.google.com/forum/#! форум / масстрансить-обсудить .

Как один из создателей MassTransit, если вы включаете

public object MyMessageProperty { get; set; }

В вашем контракте на сообщение Вы делаете это неправильно. Используйте строго типизированные функции публикации фреймворка вместо выполнения собственной динамической отправки поверх уже выполняемой системой публикации/подписки внутри MT.

Моя вышеописанная проблема, вероятно, возникла просто из-за неправильного представления о моей системе обмена сообщениями. Но я нашел неприятный обходной путь для преобразования вложенных 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;
    }
}