0

我有一个要反序列化的模型,问题是在其中一个属性上,它有时是字符串,有时是文档。所以我决定编写一个从 SerializerBase 构建的自定义序列化程序。但是,似乎框架中可能存在错误。在重写 Deserialize 方法时,我总是得到异常“ReadBsonType 只能在 State 为 Type 时调用,而不能在 State 为 Value 时调用。”

我正在使用 .Net 框架 4.6.2,我的 mongo 库的所有版本都是 2.8.0

这是我的课程的简化版本以及我如何实现它。

public class MyClassSerializer : SerializerBase<string>
{
    public override string Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
    {
        // ultimately I will have some logic here but for now just trying to get this to not throw an error.
        return string.Empty;
    }
}

这是我试图反序列化的模型:

public class FormData
{
    [BsonId]
    public string Id { get; set; }

    [BsonSerializer(typeof(MyClassSerializer))]
    public string Data { get; set; }
}

这似乎是一个非常开箱即用的解决方案,任何人都可以看到我可能做错了什么吗?另外因为我正在尝试编写一个可以处理类型转换的自定义序列化程序,是否有更合适的方法来实现这一点?

谢谢!

编辑:下面是我得到的堆栈跟踪:

在 MongoDB.Bson.Serialization.BsonClassMapSerializer 1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap) at MongoDB.Bson.Serialization.BsonClassMapSerializer1.DeserializeClass(BsonDeserializationContext 上下文) 在 MongoDB.Bson.Serialization.BsonClassMapSerializer 1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer1 序列化程序,BsonDeserializationContext 上下文) 在 MongoDB.Driver.Core.Operations.CursorBatchDeserializationHelper.DeserializeBatch[TDocument](RawBsonArray 批处理,IBsonSerializer` 1个文档序列化器,

4

3 回答 3

1

使用此代码

public class MyClass {
public ObjectId Id { get; set; }
[BsonSerializer(typeof(MyCustomStringSerializer))]
public string X { get; set; }
}

BsonClassMap.RegisterClassMap<MyClass>(cm => {
cm.AutoMap();
cm.GetMemberMap(c => c.X).SetSerializer(new MyCustomStringSerializer());
});
于 2020-02-07T10:46:22.733 回答
0

我最终为模型本身而不是特定属性编写了序列化程序,这现在可以工作了。

于 2019-04-23T19:36:51.923 回答
0

将您的类更改为对象怎么样?我遇到了类似的问题并且它有效。

public object myObject { get; set; }
于 2019-04-23T18:21:26.703 回答