接上篇。。。。
字段或属性层次的序列化选项
有许多种让你控制序列化的方式,上一节通过约定方法来控制序列化,你也可以通过代码配置或者成员映射或者使用特性来控制你的序列化,下面说道的序列化的各个方面,我们都会展示两种方式。
Opt-In
大多数类会使他们的属性自动映射,有一些情况下,不会出现这种情形,例如,如果你的属性是只读的,那么它便不会加入到自动映射的队列中,为了包含该只读属性,你可以使用BsonElementAttribute
public class MyClass { private readonly string _someProperty; [BsonElement] public string SomeProperty { get { return _someProperty; } } }
也可以不使用特性而是下面的初始化代码实现同样的结果:
BsonClassMap.RegisterClassMap<MyClass>(cm => { cm.MapProperty(c => c.SomeProperty); });
注意:
当只读属性被序列化后,它的值会持久化到数据库,并不会被读出来
Element name元素名称
指定元素名称使用特性BsonElement:
public class MyClass { [BsonElement("sp")] public string SomeProperty { get; set; } }
也可以不使用特性而是下面的初始化代码实现同样的结果:
BsonClassMap.RegisterClassMap<MyClass>(cm => { cm.AutoMap(); cm.GetMemberMap(c => c.SomeProperty).SetElementName("sp"); });
注意:我们是第一次对类进行了自动映射,然后覆写类中某一个块,如果我们不先调用AutoMap 那么GetMemberMap就会因为没有成员映射而抛出异常。
Element Order
如果你想精确控制BSON文档中的元素的顺序,你可以使用BsonElement特性的Order 命名参数:
public class MyClass { [BsonElement("sp", Order = 1)] public string SomeProperty { get; set; } }
或者使用下面代码来替代特性方式:
BsonClassMap.RegisterClassMap<MyClass>(cm => { cm.AutoMap(); cm.GetMemberMap(c => c.SomeProperty).SetElementName("sp").SetOrder(1); });
任何显示使用Order 的字段或者属性序列化会发生在不用Order 之前
设置ID字段或属性
设置类的哪一列是ID列或者属性你可以这样做:
public class MyClass { [BsonId] public string SomeProperty { get; set; } }
或者使用下面代码来替代特性方式:
BsonClassMap.RegisterClassMap<MyClass>(cm => { cm.AutoMap(); cm.SetIdMember(cm.GetMemberMap(c => c.SomeProperty)); });
当不适用自动映射时,你也可以按照下面的方式来指定ID字段或者属性:
BsonClassMap.RegisterClassMap<MyClass>(cm => { cm.MapIdProperty(c => c.SomeProperty); // mappings for other fields and properties });
注意:
默认的约定,会发现公共属性或字段名称“Id”, “id”, or “_id”,所以没有必要为这个字段使用显示的特性或者映射
为id字段或属性选择IdGenerator(生成器)
当插入一个文档时,C#驱动会检查是否给Id成员赋值,如果没有,它会给这个字段或属性生成一个唯一的值,由于Id成员可以是任何类型,所以驱动需要一个匹配的IdGenerator 的帮助来检查这个是否已经赋值,如果没会生成值。驱动内置了一下几个IdGenerators :
- BsonObjectIdGenerator
- CombGuidGenerator
- GuidGenerator
- NullIdChecker
- ObjectIdGenerator
- StringObjectIdGenerator
- ZeroIdChecker<T>
有些IdGenerators 用于产生某些通用的Id类型
- BsonObjectIdGenerator 用于 BsonObjectId
- GuidGenerator 用于 Guid
- ObjectIdGenerator用于 ObjectId
- StringObjectIdGenerator 用于字符串类型的 ObjectId
可以这样为你的Id字段或属性选择IdGenerator :
public class MyClass { [BsonId(IdGenerator = typeof(CombGuidGenerator))] public Guid Id { get; set; } }
或者使用下面代码来替代特性方式:
BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.AutoMap();
cm.IdMemberMap.SetIdGenerator(CombGuidGenerator.Instance);
});
如果说所有的Guids你都用CombGuidGenerator 生成,你可以这样写:
BsonSerializer.RegisterIdGenerator( typeof(Guid), CombGuidGenerator.Instance );
NullIdChecker 和ZeroIdChecker<T> Id生成器是用于当您不存在一个IdGenerator 为您生成Id是但你想强制Id不为null或者0.
BsonSerializer.UseNullIdChecker = true; // used for reference types BsonSerializer.UseZeroIdChecker = true; // used for value types
最近有点忙了,一点一点来吧,今天先这么多,明天继续。。。