2015-04-20 5 views
2

Я пытаюсь отправить сложные объекты, используя EasyNetQ но продолжают работать в этом исключение, потому что мой объект содержит список дочерних объектов, которые ссылаются обратно в родительский объект:Изменить настройки Json.NET сериализации

Self referencing loop detected for property 'Parent' with type 'Domain.ParentItem'. 
Path 'Entity.Children[0]'."} 

I попытались изменить настройки JSON.NET по умолчанию, как это так, но это не решает проблему:

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
{ 
    Formatting = Formatting.Indented, 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
}; 

Как я могу изменить настройки по умолчанию сериализатора Json так что я могу обойти эту проблему без необходимости создания отдельные объекты DTO?

Редактировать: Я пробовал предложения в возможном дубликате (как я положил в своем оригинальном сообщении), и это не решило проблему.

+1

Возможный дубликат [JSON.NET Error Self референтный цикл обнаружен для типа] (http://stackoverflow.com/questions/7397207/json-net-error-self-referencing-loop-detected-for-type) –

+0

Как вы сериализуете свои объекты? Вы уверены, что используете настройки по умолчанию? – dbc

ответ

0

Прежде всего, вам необходимо создать класс, который реализует ISerializer interface.

Например:

public class MyCustomSerializaer : ISerializer 
{ 
    // Add appropriate implementation containing your custom 
    // serialization/deserialization logic here 
} 

Далее, вам нужно создать метод, который будет регистрировать экземпляр этого класса с экземпляром IServiceRegister:

public void RegisterServices(IServiceRegister serviceRegister) 
{ 
    serviceRegister.Register(serviceProvider => new MyCustomSerializer()); 
} 

Примечание: для ясности, я запись RegisterServices как отдельный метод; однако вы можете использовать Action<IServiceRegister> вместо этого для краткости, если хотите.

Наконец, обеспечивает RegisterServices в качестве аргумента при вызове RabbitHutch.CreateBus:

var bus = RabbitHutch.CreateBus(connectionString, RegisterServices); 

Это гарантирует, что bus будет использовать свой собственные сериализации класса вместо используемого по умолчанию сериалайзер EasyNetQ в. Будьте осторожны, чтобы ваши производители и потребители использовали совместимую реализацию сериализатора; в противном случае ваши потребители получат сообщения, которые они не могут десериализовать.

Обратите внимание, что EasyNetQ позволяет заменить другие компоненты. Для получения дополнительной информации см. here.

Смежные вопросы