码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-08-25 21:51:47      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:mongodb   结构   byte   c#   序列化   

我们知道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

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:mongodb   结构   byte   c#   序列化   

原文地址:http://blog.csdn.net/norsd/article/details/47981931

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!