将Mongodb字符串反序列化为对象

时间:2014-07-18 23:07:44

标签: c# mongodb serialization bson

我有一个对象作为我为其创建自定义序列化程序的属性。它只是调用ToString,因为我想将数据表示为我的集合中的字符串。

cm.MapMember(c => c.myObjectProperty).SetSerializer(new ObjectToStringSerializer() );

以上只调用一次,在保存数据时效果很好。我可以按预期看到带有字符串值的父对象。

这是基本的序列化器:

public class ObjectToStringSerializer : IBsonSerializer {


        #region IBsonSerializer Members

        public object Deserialize(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
        {
            if (bsonReader.State == MongoDB.Bson.IO.BsonReaderState.Type && bsonReader.CurrentBsonType != MongoDB.Bson.BsonType.Null)
                return Activator.CreateInstance(nominalType, new object[] { bsonReader.ReadString() });
            return null;
        }

        public object Deserialize(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options)
        {

            if( bsonReader.State == MongoDB.Bson.IO.BsonReaderState.Type && bsonReader.CurrentBsonType != MongoDB.Bson.BsonType.Null)
                return Activator.CreateInstance(nominalType, new object[] { bsonReader.ReadString() });
            return null;
        }

        public IBsonSerializationOptions GetDefaultSerializationOptions()
        {
            throw new NotImplementedException();
        }

        public void Serialize(MongoDB.Bson.IO.BsonWriter bsonWriter, Type nominalType, object value, IBsonSerializationOptions options)
        {


            if (value != null)
            {
                bsonWriter.WriteString(value.ToString());
            }
            else
                bsonWriter.WriteNull();

        }

        #endregion
    }

当我尝试从集合中获取父对象时,抛出异常:

  

ReadBsonType只能在State为Type时调用,而不能在State为Value时调用。

堆栈跟踪看起来不像是试图调用我的自定义序列化程序的反序列化方法。

为了我希望被调用的反序列化方法,我缺少什么?我已经尝试添加一个简单的序列化提供者,但我认为没错。我也试过了 重新设置序列化器。

BsonSerializer.RegisterSerializer(typeof(myObjectPropertyType), new ObjectToStringSerializer());

1 个答案:

答案 0 :(得分:2)

问题在于我对反序列化成员的条件。

if (bsonReader.State == MongoDB.Bson.IO.BsonReaderState.Type && bsonReader.CurrentBsonType != MongoDB.Bson.BsonType.Null)

从未对创作者进行过调用。我把它改成了

if (bsonReader.State == MongoDB.Bson.IO.BsonReaderState.Value && bsonReader.CurrentBsonType == MongoDB.Bson.BsonType.String)