我正在使用官方的 MongoDb C# 驱动程序。
我的场景:我将对象存储到 MongoDb 中。所有对象都是从同一根类继承的类的实例。 在设计时,我不知道所有可以存储的类(即它们可以插入) - 所以我需要一些方法来告诉序列化程序/驱动程序如何将类映射到文档(文档中的描述符)。
有人有什么想法吗?
最佳答案
只要对象的实际类型与标称类型不同,官方 C# 驱动程序就会写入一个“_t”鉴别器值。比如:
MyRootClass obj = new MyDerivedClass();
collection.Insert(obj);
也可以编写插入语句:
collection.Insert<MyRootClass>(obj);
但让编译器推断类型参数更容易。
由于 obj 的实际类型与名义类型不同,因此将写入“_t”鉴别器。
读回对象时,您必须确保 MyDerivedClass 已正确注册:
BsonClassMap.RegisterClassMap<MyDerivedClass>();
否则序列化器将无法识别鉴别器(这似乎是一种限制,但序列化器只能使用它知道的类型是合乎逻辑的)。
您提到您在编译时不知道类,因此必须动态调用上述注册代码。一种方法是:
Type myDerivedClass; // your plugged-in class
var registerClassMapDefinition = typeof(BsonClassMap).GetMethod("RegisterClassMap", new Type[0]);
var registerClassMapInfo = registerClassMapDefinition.MakeGenericMethod(myDerivedClass);
registerClassMapInfo.Invoke(null, new object[0]);
从技术上讲,序列化不使用反射;它是元数据驱动的。使用一次反射构造class map,之后直接使用class map,不用反射,开销比较低。
关于c# - 使用 C# 从 MongoDB 获取继承的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265396/