代码之家  ›  专栏  ›  技术社区  ›  Max.Futerman

在MongoDB中序列化枚举的哈希集

  •  0
  • Max.Futerman  · 技术社区  · 7 年前

    课程为:

    public class EnginesPerFile
    {
        public Guid FileId { get; set; }
        public string Path { get; set; }
        public HashSet<EngineType> Engines { get; set; }
    }
    

    BsonClassMap.RegisterClassMap<EnginesPerFile>(cm =>
                {
                    cm.AutoMap();
                    cm.MapIdField(c => c.FileId);
                    cm.MapMember(c => c.Engines).SetSerializer(new EnumSerializer<EngineType>(BsonType.String));
                });
    

    Value type of serializer is EngineType and does not match member type System.Collections.Generic.HashSet`1[[Playground.Model.EngineType, Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
    

    参数名称:序列化程序。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Max.Futerman    7 年前

    我通过编写自定义序列化程序来修复它:(EngineType可以是泛型T)

     public class MyHashSetSerializer : SerializerBase<HashSet<EngineType>>
    {
        private readonly IBsonSerializer _serializer =
            BsonSerializer.LookupSerializer(typeof(EngineType));
    
        public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, HashSet<EngineType> value)
        {
            var set = (HashSet<EngineType>)value;
    
            context.Writer.WriteStartDocument();           
            int i = 0;
            foreach (var element in set)
            {
    
                context.Writer.WriteName($"[{i}]");
                context.Writer.WriteString(element.ToString());
            }
            context.Writer.WriteEndDocument();
        }
    
        public override HashSet<EngineType> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
        {
            var set = new HashSet<EngineType>();
    
            context.Reader.ReadStartDocument();
            while (context.Reader.ReadBsonType() != 0)
            {
                context.Reader.SkipName();
                var element =
                    (EngineType)_serializer.Deserialize(context, args);              
                set.Add(element);
            }
            context.Reader.ReadEndDocument();
    
            return set;
        }
    }
    

    然后我注册类映射如下:

    BsonClassMap.RegisterClassMap<EnginesPerFile>(cm =>
                {
                    cm.AutoMap();
                    cm.MapIdField(c => c.FileId);
                    cm.MapMember(c => c.Engines).SetSerializer(new MyHashSetSerializer());
                });