忽略 Elasticsearch Nest 中的 TypeConverter 属性
Ignoring TypeConverter attribute in Elasticsearch Nest
我参考了在包含 TypeConverter 属性的外部库中定义的几个 类。由于此属性,Json.Net 以及 Nest 错误地序列化了这些对象。序列化这些对象的正确方法是忽略 TypeConverter 属性并使用对象属性。在搜索 Stack Overflow 时,我找到了一种成功执行 this.
的方法
不幸的是,当我按以下方式将此方法应用于 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 请求所需的附加字段?
在我看来,当您传递一个忽略 TypeConverter 的合同解析器时,您就是在使用火箭筒来杀死一只苍蝇。
我们还严重依赖类型转换器来正确编写我们的对象。
如果外部库中的 类 不能完全代表它们在 elasticsearch 索引中的外观,我建议为 NEST 创建一个特定的 POCO
。 AutoMapper 是将外部库实例转换为可索引对象实例的好方法。
@Martijn Laarman 的建议可能是正确的解决方案。但是,我决定使用以下 hack 来解锁自己:
我继续使用定义的方法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));
我参考了在包含 TypeConverter 属性的外部库中定义的几个 类。由于此属性,Json.Net 以及 Nest 错误地序列化了这些对象。序列化这些对象的正确方法是忽略 TypeConverter 属性并使用对象属性。在搜索 Stack Overflow 时,我找到了一种成功执行 this.
的方法不幸的是,当我按以下方式将此方法应用于 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 请求所需的附加字段?
在我看来,当您传递一个忽略 TypeConverter 的合同解析器时,您就是在使用火箭筒来杀死一只苍蝇。
我们还严重依赖类型转换器来正确编写我们的对象。
如果外部库中的 类 不能完全代表它们在 elasticsearch 索引中的外观,我建议为 NEST 创建一个特定的 POCO
。 AutoMapper 是将外部库实例转换为可索引对象实例的好方法。
@Martijn Laarman 的建议可能是正确的解决方案。但是,我决定使用以下 hack 来解锁自己:
我继续使用定义的方法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));