使用C#在mongoDB中存储具有多态值的字典

让我们说我们有一个关键值,它们的意义上是多态的。 考虑下一个示例项目:

public class ToBeSerialized { [BsonId] public ObjectId MongoId; public IDictionary Dictionary; } public abstract class BaseType { } public class Type1 : BaseType { public string Value1; } public class Type2:BaseType { public string Value1; public string Value2; } internal class Program { public static void Main() { var objectToSave = new ToBeSerialized { MongoId = ObjectId.GenerateNewId(), Dictionary = new Dictionary { {"OdEd1", new Type1 {Value1="value1"}}, { "OdEd2", new Type1 {Value1="value1"} } } }; string connectionString = "mongodb://localhost/Serialization"; var mgsb = new MongoUrlBuilder(connectionString); var MongoServer = MongoDB.Driver.MongoServer.Create(mgsb.ToMongoUrl()); var MongoDatabase = MongoServer.GetDatabase(mgsb.DatabaseName); MongoCollection mongoCollection = MongoDatabase.GetCollection("Dictionary"); mongoCollection.Save(objectToSave); ToBeSerialized received = mongoCollection.FindOne(); } } 

有时当我尝试反序列化时,我会得到反序列化错误,例如“Unknown discriminator value’具体类型的名称’”。 我究竟做错了什么? 如果每个值存储_t为什么它不能正确映射?

驱动程序应该知道所有鉴别器,以反序列化任何类,没有错误。 有两种方法可以做到:

1.在应用启动期间全局注册:

 BsonClassMap.RegisterClassMap(); BsonClassMap.RegisterClassMap(); 

2.或者BsonKnownTypes attibute :

 [BsonKnownTypes(typeof(Type1), typeof(Type2)] public class BaseType { } 

如果您将使用#1或#2,则反序列化将正常工作。

在尝试反序列BaseClass之前,您必须注册从BaseClassinheritance的类型。 如果首先序列化,这将自动发生,这可能是有时仅出现错误的原因。

您可以使用属性注册派生类型:

 [BsonDiscriminator(Required = true)] [BsonKnownTypes(typeof(DerivedType1), typeof(DerivedType2))] public class BaseClass { ... } public class DerivedType1 : BaseClass { ... }