2015-01-30 3 views
0

У меня есть ссылка на несколько классов, определенных во внешней библиотеке, содержащей атрибут TypeConverter. Из-за этого атрибута Json.Net и, следовательно, Nest, неправильно сериализуют эти объекты. Правильный способ сериализации этих объектов - игнорировать атрибут TypeConverter и использовать свойства объекта. В поисках переполнения стека я нашел метод, который успешно выполняет this.Игнорирование атрибута TypeConverter в Elasticsearch Nest

К сожалению, когда я применяю этот метод к Nest следующим образом, результирующие объекты не содержат необходимых полей _type, _index и _id.

var settings = new ConnectionSettings(_Uri); 
// Tell Json.Net to ignore custom TypeConverters 
settings.SetJsonSerializerSettingsModifier(m => m.ContractResolver = new SerializableContractResolver()); 
var client = new ElasticClient(settings); 

Поскольку результирующий JSON не содержит критические поля, все запросы индекса терпят неудачу. Есть ли способ, чтобы Nest игнорировал атрибуты TypeConverter, сохраняя при этом, чтобы объекты содержали необходимые дополнительные поля для запросов Elasticsearch?

ответ

2

Когда вы проходите контракт, который игнорирует TypeConverters, вы применяете базуку, чтобы убить муху, на мой взгляд.

Мы также сильно полагаемся на typeconverters, чтобы написать наши объектов правильно.

Если классы в вашей внешней библиотеке не совсем отражают то, как они должны выглядеть в вашем индексе elasticsearch, я бы рекомендовал создать конкретный POCO для NEST. AutoMapper - отличный способ конвертировать экземпляры вашей внешней библиотеки в экземпляры индексируемого объекта.

0

Предложение @Martijn Laarman, вероятно, является правильным решением. Тем не менее, я решил разблокировать себя со следующим взломом:

Я продолжаю использовать метод, определенный here. Затем я правильно сериализую внешний объект в JSON. Я десериализую объект в динамический тип. Наконец, я передаю этот объект в Nest.

// Strip away TypeConverter attributes -- super hacky 
var json = JsonConvert.SerializeObject(item); 
payload = JsonConvert.DeserializeObject<dynamic>(json); 
descriptor.Index<Object>(op => op.Index(index).Type(type).Id(id).Document(payload)); 
Смежные вопросы