Сложное сообщение и массовая де-сериализация
Я публикую сообщение в MT, которое имеет несколько свойств типа объекта, так как я не знаю тип во время компиляции. Когда я получаю сообщение в приемнике, я вижу, что типизированные свойства объекта заполнены экземплярами Newtonsoft JObject. Класс JObject находится в ILMerged Newtonsoft.В JSON-сборка в широкие.файл DLL. Класс JObject в этой сборке помечен как внутренний. Всякий раз, когда я пытаюсь привести значение свойства к JObject, предоставляемому NuGet-сборкой Newtonsoft.формат JSON он терпит неудачу.
Итак, мои вопросы:
- Как правильно привести значение свойства к JObject?
- Почему актерский состав терпит неудачу? Это означает, что какие трудности есть у clr здесь?
- я могу получить сырье, тело сообщения необходимо выполнить десериализацию в моих потребителей?
Спасибо.
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; } }