我们知道MongoDb不支持byte(BsonType中根本没有定义byte), 但是在实际生产环境中数据结构(特别是远古时代的数据结构)往往包含byte数据项。
这时候无法保存原有的数据结构,一般会另外创建一个Wrapper结构(Wrapper内部将byte转为int等MongoDb可以识别的类型),最后将Wrapper存入MongoDb。
无疑,这种方法并不优雅。
(下面的方法实现于c#, MongoDb的驱动是2.0版本)
我们希望能够让MongoDb自动将byte转化为int,这样所有问题就引刃而解了。
用代码说话:
class ByteSerializer :IBsonSerializer
{
public Type ValueType
{
get {
return typeof(byte);
}
}
public object Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var b = (byte)context.Reader.ReadInt32();
return b;
}
public void Serialize(BsonSerializationContext context, BsonSerializationArgs args, object value)
{
context.Writer.WriteInt32((int)(byte)value);
}
}
上面的代码构建了一个针对byte的序列化类
随后我们在全局部分对目标结构“MyClass” 操作。
BsonClassMap.RegisterClassMap<MyClass>(cm =>
{
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.Id));
cm.GetMemberMap<byte>(o => o.ByteItem).SetSerializer(new ByteSerializer());
});
完成这部份之后,以后就可以爽快的将数据结构上传到MongoDb了。
其他类似情况,例如 underlying为byte的enum等等
Have fun!
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/norsd/article/details/47981931