C# Mongo 驱动 MongoDB.Bson.BsonSerializationException: Unknown discriminator value

报错:

 ---> MongoDB.Bson.BsonSerializationException: Unknown discriminator value 'OBagItem'.
   at MongoDB.Bson.Serialization.BsonSerializer.LookupActualType(Type nominalType, BsonValue discriminator)
   at MongoDB.Bson.Serialization.Conventions.ObjectDiscriminatorConvention.GetActualType(IBsonReader bsonReader, Type nominalType)
   at MongoDB.Bson.Serialization.Serializers.DiscriminatedInterfaceSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.Serializers.DictionarySerializerBase`3.DeserializeArrayRepresentation(BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.Serializers.DictionarySerializerBase`3.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.ClassSerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
   --- End of inner exception stack trace ---
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase`2.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
   --- End of inner exception stack trace ---
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer, BsonDeserializationContext context)
   at MongoDB.Bson.Serialization.BsonSerializer.Deserialize(IBsonReader bsonReader, Type nominalType, Action`1 configurator)
   at MongoDB.Bson.Serialization.BsonSerializer.Deserialize(Stream stream, Type nominalType, Action`1 configurator) 

原Code:

public interface IBagItem
{
    public uint DbId { get; set; }

    public uint UId { get; set; }

    public uint ItemId { get; set; }

    public uint ItemCount { get; set; }
}

public class OBagItem : IBagItem
{
}

public class ODreamIslandBagItem : IBagItem
{
}

public class Test
{
    public void Test()
    {
        Dictionary<uint, BagItemBase> dic = new();
        
        dic.Add(new OBagItem() { DbId = 1, UId = 1, ItemId = 1,});
        dic.Add(new OBagItem() { DbId = 2, UId = 1, ItemId = 2,});

        // 序列化 dic 报错
    }
}

下面的方式都可以:

方法1: 

public class BagItemBase
{
    public uint DbId { get; set; }

    public uint UId { get; set; }

    public uint ItemId { get; set; }

    public uint ItemCount { get; set; }
}

public class OBagItem : BagItemBase
{
}

public class ODreamIslandBagItem : BagItemBase
{
}

public class Test
{
    public void Test()
    {
        Dictionary<uint, BagItemBase> dic = new();
        
        dic.Add(new OBagItem() { DbId = 1, UId = 1, ItemId = 1,});
        dic.Add(new OBagItem() { DbId = 2, UId = 1, ItemId = 2,});

        // 序列化 dic 正常
    }
}

public static class MongoRegister
{
    static MongoRegister()
    {
        BsonClassMap.RegisterClassMap<BagItemBase>();
        BsonClassMap.RegisterClassMap<OBagItem>();
        BsonClassMap.RegisterClassMap<ODreamIslandBagItem>();
    }
}

方法2: 

[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(OBagItem), typeof(ODreamIslandBagItem))]
public class BagItemBase
{
    public uint DbId { get; set; }

    public uint UId { get; set; }

    public uint ItemId { get; set; }

    public uint ItemCount { get; set; }
}

[BsonDiscriminator("OBagItem")]
public class OBagItem : BagItemBase
{
}

[BsonDiscriminator("ODreamIslandBagItem")]
public class ODreamIslandBagItem : BagItemBase
{
}

public class Test
{
    public void Test()
    {
        Dictionary<uint, BagItemBase> dic = new();
        
        dic.Add(new OBagItem() { DbId = 1, UId = 1, ItemId = 1,});
        dic.Add(new OBagItem() { DbId = 2, UId = 1, ItemId = 2,});

        // 序列化 dic 正常
    }
}

参考

Polymorphism (mongodb.github.io)

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值