二进制不是ObjectIdSerializer的有效表示

时间:2017-07-26 11:01:12

标签: mongodb bson mongodb-.net-driver

我正在尝试从TestObject类设置ObjectId。唯一的问题是我不断获得异常,我无法调试此序列化过程。

我的MongoDB:

rand.nextInt(color.length)
  

解析'MongoDataSource'数据源时发生错误:调用数据检索方法时出错。

     

--- InnerException ---

     

反序列化类TestObject的Object属性时发生错误:无法从BsonType'Binary'反序列化'ObjectId'。

     

--- InnerException ---

     

无法从BsonType'Binary'反序列化'ObjectId'。

{
    "_id" : LUUID("964c87a0-bf8a-1f4e-be85-7aadb5315adb")
}

如果我把它变成BsonType.Binary

  

解析'MongoDataSource'数据源时发生错误:调用数据检索方法时出错。

     

--- InnerException ---

     

调用目标抛出了异常。

     

--- InnerException ---

     

二进制不是ObjectIdSerializer的有效表示。

[DataObject]
public class TestObject
{
    [BsonId]
    [BsonElement("_id")]
    public ObjectId ObjectId { get; set; }
}

1 个答案:

答案 0 :(得分:1)

问题是Mongo集合中的字段存储为LUUID(它是GUID),与ObjectId相比,它是一种完全不同的类型。

在地图类中,您定义了

[DataObject]
public class TestObject
{
    [BsonId]
    [BsonElement("_id")]
    public ObjectId ObjectId { get; set; }
}

当驱动程序尝试反序列化值964c87a0-bf8a-1f4e-be85-7aadb5315adb(GUID的字符串表示形式)失败时。

好消息GUID的id生成器附带驱动程序,只需按照驱动程序的约定即可轻松实现所需的结果:

public class TestObject
{
    public Guid Id { get; set; } // note the property is renamed in Id
}

根据official documentation,您可以省略[BsonId] [BsonElement("_id")][BsonId(IdGenerator = typeof(GuidGenerator))]属性,只要该属性名为Id且其类型是受支持的类型之一的。