Jan*_*son 5 c# mongodb mongodb-.net-driver
我正在使用官方的MongoDb C#驱动程序.
我的场景:我将对象存储到MongoDb中.所有对象都是从同一根类继承的类的实例.在设计时我不知道所有可以存储的类(即它们都可以插入) - 所以我需要一些方法告诉序列化器/驱动程序如何将类映射到文档(文档中的描述符).
有人有任何想法吗?
只要对象的实际类型与标称类型不同,官方C#驱动程序就会写一个"_t"鉴别器值.例如:
MyRootClass obj = new MyDerivedClass();
collection.Insert(obj);
Run Code Online (Sandbox Code Playgroud)
Insert语句也可以写成:
collection.Insert<MyRootClass>(obj);
Run Code Online (Sandbox Code Playgroud)
但是让编译器推断出类型参数会更容易.
由于obj的实际类型与标称类型不同,因此将写入"_t"鉴别器.
回读对象时,您必须确保MyDerivedClass已正确注册:
BsonClassMap.RegisterClassMap<MyDerivedClass>();
Run Code Online (Sandbox Code Playgroud)
或者序列化器不会识别鉴别器(这看起来似乎是一种限制,但序列化器只能使用它知道的类型才符合逻辑).
您提到在编译时不了解类,因此必须动态调用上述注册代码.一种方法是:
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]);
Run Code Online (Sandbox Code Playgroud)
从技术上讲,序列化不使用反射; 它是元数据驱动的.使用一次反射来构造类映射,但之后直接使用类映射而不进行反射,并且开销相当低.
| 归档时间: |
|
| 查看次数: |
2469 次 |
| 最近记录: |