2015-01-30 1 views
0

TypeConverter 특성이 포함 된 외부 라이브러리에 정의 된 여러 클래스에 대한 참조가 있습니다. 이 특성으로 인해 Json.Net과 결과적으로 Nest는 이러한 개체를 잘못 serialize합니다. 이러한 개체를 serialize하는 올바른 방법은 TypeConverter 특성을 무시하고 개체 속성을 사용하는 것입니다. 스택 오버플로 검색에서 나는 성공적으로 this을 수행하는 메소드를 발견했습니다.Elasticsearch Nest에서 TypeConverter 특성 무시

불행히도이 메서드를 다음과 같은 방식으로 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에 중요한 필드가 없으므로 모든 인덱스 요청이 실패합니다. 개체가 Elasticsearch 요청에 필요한 추가 필드를 포함하는지 확인하면서 Nest에서 TypeConverter 특성을 무시하도록 할 수 있습니까?

답변

2

TypeConverters를 무시하는 계약 해결자를 전달할 때 내 의견으로는 파리를 죽이기 위해 바주카포를 적용하고 있습니다.

우리는 또한 개체를 올바르게 작성하기 위해 typeconverters에 크게 의존합니다.

외부 라이브러리의 클래스가 elasticsearch 인덱스에서 보이는 방식을 잘 나타내지 않으면 NEST에 대해 POCO 특정을 만드는 것이 좋습니다. AutoMapper은 외부 라이브러리의 인스턴스를 인덱싱 가능 개체의 인스턴스로 변환하는 가장 좋은 방법입니다.

0

@Martijn Laarman의 제안이 아마도 올바른 해결책 일 것입니다. 그러나 다음과 같은 해킹으로 자신의 차단을 해제하기로 결정했습니다.

정의 된 방법을 계속 사용합니다. here. 그런 다음 외부 개체를 JSON으로 올바르게 serialize합니다. 개체를 동적 형식으로 deserialize합니다. 마지막으로이 객체를 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)); 
관련 문제