MongoDB C# десериализовать в DTO с различными типами - PullRequest
0 голосов
/ 20 марта 2020

Итак, у меня есть бизнес-модель, подобная этой:

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 (установить список после десериализации), но это похоже на проблему, с которой я, вероятно, столкнусь снова, поэтому я хотел знать, возможно ли это.

...