C#/ MongoDB-将枚举字典键序列化为字符串

时间:2019-06-13 16:12:57

标签: c# mongodb dictionary enums

我正在尝试序列化词典的字典,其中父词典的键为enum类型,子词典的键为DateTime类型。尝试插入我的收藏夹时,我遇到了

  

使用DictionaryRepresentation时。文档键值必须序列化为字符串

我读过一些论坛,讨论了将enum序列化为string的过程,但是由于当前存在模型定义,我不确定如何使用此方法。

当前使用的两个字典模型只是Dictionary类的实现:

索引值

{
    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 :(得分:0)

原来,我需要两个串行器而不是一个。我在全局范围内定义了这些代码,并且可以毫无问题地插入。

BsonSerializer.RegisterSerializer(new EnumSerializer<Index>(BsonType.String));
BsonSerializer.RegisterSerializer(new DateTimeSerializer(DateTimeKind.Local, BsonType.String));