Итак, у меня есть бизнес-модель, подобная этой:
public class BusinessModel
{
...
public List<DateTime> Dates { get; set; }
}
Этот объект сериализуется и сохраняется как положено. Единственная проблема заключается в том, что DTO, который я использую, хранит даты как javascript отметку времени (double).
public class DTO
{
...
public List<double> Dates { get; set; }
}
Я правильно сопоставил другие свойства класса, используя функциональность ClassMap; но, очевидно, мне нужен был специальный десериализатор для обработки преобразования DateTime в удвоение.
Я написал следующее для решения этой проблемы, однако Mon go явно выдает ошибку, поскольку типы не совпадают.
public class JsDateSerializer : SerializerBase<List<double>>
{
private DateTimeSerializer dateTimeSerializer = new DateTimeSerializer(true);
public override List<double> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
context.Reader.ReadStartArray();
List<double> result = new List<double>();
while (true)
{
try
{
//this catch block only need to identify the end of the Array
context.Reader.ReadStartDocument();
}
catch (Exception exp)
{
context.Reader.ReadEndArray();
break;
}
DateTime date = dateTimeSerializer.Deserialize(context);
result.Add(date.TojsTimestampUTC());
context.Reader.ReadEndDocument();
}
return result;
}
}
BsonClassMap.RegisterClassMap<DTO>(cm =>
{
cm.SetIgnoreExtraElements(true);
cm.MapMember(c => c.Dates).SetSerializer(new JsDateSerializer());
});
Я знаю, что мог бы просто дублировать свойства в DTO (установить список после десериализации), но это похоже на проблему, с которой я, вероятно, столкнусь снова, поэтому я хотел знать, возможно ли это.