为NEST序列化重写一个特定类型的最简单方法是什么



我有一个复杂的文档,它在各种不同的子键中有一个自定义日期字段,即:

var doc = new Document
{
MyCustomDateTime StartTime
Matches = new []
{
MyCustomDateTime StartTime
MyCustomDateTime EndTime
}
}

如果不使用属性属性,因为此类型是从dll中拉入的,那么我可以重写类型MyCustomDateTime的序列化和反序列化的最简单方法是什么。

我正在寻找类似的东西,或者扩展默认的序列化程序类来处理一个额外的类型:

settings.DefaultSerializerFor<MyCustomDateTime>(d => MyConverter.ToString(d), d => MyConverter.FromString(d));

或者类似的东西:

public class MyCustomSerializer : DefaultElasticSearchSerializer
{
public string OnSerialize(object member)
{
if (member is MyCustomDateTime) { return MyConverter.ToString(d); }
return base.OnSerialize(member);
}
...
}

现在,它似乎只发布对象的公共属性。不幸的是,对于这个特定的类,这不是我想要的行为。

实现自定义序列化的最简单方法是

  1. 连接JsonNetSerializer
  2. 为您的类型定义转换器
  3. 向JsonNetSerializer注册

示例

private static void Main()
{
var defaultIndex = "default_index";
var pool = new SingleNodeConnectionPool(new Uri($"http://localhost:9200"));
var settings = new ConnectionSettings(
pool, 
(builtin, settings) => new JsonNetSerializer(builtin, settings, contractJsonConverters: new List<JsonConverter>
{
new MyCustomDateTimeConverter()
}))
.DefaultIndex(defaultIndex);

var client = new ElasticClient(settings);

var indexResponse = client.Index(
new MyDocument {
Message = "message",
CustomDateTime = new MyCustomDateTime 
{ 
Custom = new DateTimeOffset(2022,1,9,14,0,0,0, TimeSpan.FromHours(10)) 
}
}, i => i.Id(1));
}
public class MyCustomDateTime 
{
public DateTimeOffset Custom { get; set; }
}
public class MyCustomDateTimeConverter : JsonConverter<MyCustomDateTime>
{
public override void WriteJson(JsonWriter writer, MyCustomDateTime value, JsonSerializer serializer)
{
writer.WriteValue(value.Custom);
}
public override MyCustomDateTime ReadJson(JsonReader reader, Type objectType, MyCustomDateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var dateTime = reader.ReadAsDateTimeOffset();
return dateTime is null ? null : new MyCustomDateTime { Custom = dateTime.Value };
}
}
public class MyDocument
{
public string Message {get;set;}    
public MyCustomDateTime CustomDateTime {get;set;}
}

产生

PUT http://localhost:9200/default_index/_doc/1?pretty=true
{
"message": "message",
"customDateTime": "2022-01-09T14:00:00+10:00"
}

最新更新