C # / MongoDB - Serialize Enum словарь ключей для строки - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь сериализовать словарь словарей, в котором родительский словарь имеет ключи типа enum, а дочерний словарь имеет ключи типа DateTime. При попытке вставить в мою коллекцию я встретил

При использовании DictionaryRepresentation.Document значения ключа должны сериализоваться как строки

Я читал форумы, обсуждающие сериализацию enum в string, однако с определениями моделей, которые существуют в настоящее время, я не уверен, как поступить с этим методом.

Две модели словарей, которые используются в настоящее время, являются просто реализациями класса Dictionary:

IndexValues ​​

{
    public class IndexValues : Dictionary<Index, DateDictionary> { }
}

DateDictionary

public class DateDictionary : Dictionary<DateTime, double>
    {
        public double AsOf(DateTime d)
        {
            DateTime date = d;
            while (date >= Keys.Min())
            {
                if (TryGetValue(date, out var value))
                {
                    return value;
                }
                date = date.AddDays(-1);
            }

            throw new Exception($"The dictionary doesn't have a value for any date less than or equal to {d}.");
        }
    }

Индекс

public enum Index
    {
        SPX,
        NDX
    }

Я добавляю значения в словарь в моей основной программе, просто создавая экземпляры новых экземпляров обоих классов и добавляя значения в требуемые типы.

IndexValues indexRecords = new IndexValues();

...

var enumHead = (Index)Enum.Parse(typeof(Index), header[l]); // header is simply a list of strings

...

DateDictionary dateDict = new DateDictionary();

var date = Convert.ToDateTime(dataLine[j]); // dataLine is simply a list of strings
var value = Convert.ToDouble(dataLine[k]);

if (indexRecords.ContainsKey(enumHead))
    {
        indexRecords[enumHead].Add(date, value);
    }
    else
    {
        dateDict.Add(date, value);
        indexRecords.Add(enumHead, dateDict);
    }

Я попытался определить ключ и значение в определениях модели и использовать [BsonRepresentation(BsonType.String)] для значений enum и DateTime и [BsonDictionaryOptions(DictionaryRepresentation.Document)] для DateDictionary, но все еще сталкиваюсь с той же проблемой.

Чего мне не хватает в этом случае, и в каком направлении следует смотреть? Для справки я использую драйвер C # v2.8.1.

1 Ответ

0 голосов
/ 14 июня 2019

Оказывается, мне нужны были два сериализатора вместо одного.Я определил их глобально и смог вставить без проблем.

BsonSerializer.RegisterSerializer(new EnumSerializer<Index>(BsonType.String));
BsonSerializer.RegisterSerializer(new DateTimeSerializer(DateTimeKind.Local, BsonType.String));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...