报错:
---> 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 正常
}
}
参考