【问题标题】:Binary is not a valid representation for an ObjectIdSerializer二进制不是 ObjectIdSerializer 的有效表示
【发布时间】:2018-01-01 15:52:49
【问题描述】:

我正在尝试从我的 TestObject 类中设置 ObjectId。唯一的问题是我不断收到异常,我无法调试这个序列化过程。

我的 MongoDB:

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

解析“MongoDataSource”数据源时出错:调用数据检索方法时出错。

--- 内部异常 ---

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

--- 内部异常 ---

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

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

如果我将其设为 BsonType.Binary

解析“MongoDataSource”数据源时出错:调用数据检索方法时出错。

--- 内部异常 ---

调用的目标已抛出异常。

--- 内部异常 ---

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

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

【问题讨论】:

  • 也许它不应该被转换为 ObjectId 类型。换句话说,您正在对注释和序列化程序进行更改,但您忘记更改类本身中属性的“类型”。俗话说,有点像把方钉塞进圆孔里。

标签: mongodb bson mongodb-.net-driver


【解决方案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 并且其类型是受支持的类型之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多