如何将含有byte数据项的结构存入MongoDb

28 篇文章 0 订阅

我们知道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://stackoverflow.com/questions/19664394/mongodb-c-sharp-exception-cannot-deserialize-string-from-bsontype-int32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值