【发布时间】:2021-10-29 01:06:59
【问题描述】:
Mongo 自定义序列化程序导致无法创建抽象类
您好,我正在尝试将自定义序列化程序添加到我的 mongo 类中,但它似乎无法正常工作。 目标是我们在数据库中有古代事件,我想以我们拥有的“新格式”来阅读它们。
但是新事件正在发生错误。这是结构
public abastract class FooBase
{
public int Version { get; set; }
public Guid AggregateId { get; set; }
//Other properties
public abstract object GetContent();
}
public class TypedFooBase<T> : FooBase
where T : class
{
public T TypedContent { get; set; }
//Other properties
public override object GetContent()
{
return TypedContent;
}
}
然后我创建了一个自定义序列化程序,如下所示:
public class BsonAncientEventSerializer<T> : SerializerBase<TypedFooBase<T>> where T : class
{
public override TypedFooBase<T> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var serializer = BsonSerializer.LookupSerializer(typeof(ExpandoObject));
var obj = serializer.Deserialize(context);
string valueString = JsonConvert.SerializeObject(obj);
return JsonConvert.DeserializeObject<TypedFooBase<T>>(valueString, new Json.JsonAncientEventSerializer<T>())
?? throw new Exception("something went wrong");
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TypedFooBase<T> value)
{
var bsonWriter = context.Writer;
var fields = value.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);
var propsAll = value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
var props = new List<PropertyInfo>();
foreach (var prop in propsAll)
{
if (prop.CanWrite)
{
props.Add(prop);
}
}
bsonWriter.WriteStartDocument();
foreach (var field in fields)
{
bsonWriter.WriteName(field.Name);
BsonSerializer.Serialize(bsonWriter, field.FieldType, field.GetValue(value));
}
foreach (var prop in props)
{
bsonWriter.WriteName(prop.Name);
BsonSerializer.Serialize(bsonWriter, prop.PropertyType, prop.GetValue(value, null));
}
context.Writer.WriteEndDocument();
}
}
然后我注册序列化器:
BsonSerializer.RegisterSerializer(
typeof(TypedFooBase<TestEvent>),
new BsonAncientEventSerializer<TestEvent>()
);
如果我不注册序列化程序,一切正常(除了与旧事件的兼容性)。 但是当我添加注册序列化程序时,代码无法正常工作;
serialize 工作正常(值正确存储在数据库中);
但在阅读时,它不起作用。代码根本不会停在Deserialize。
我在代码中访问的集合是IMongoCollection<FooBase>;
然后当我执行collection.Find(...).ToListAsync() 时,它给了我一个Cannot create an abstract class 的错误。
这是因为它试图将值转换为FooBase;
但它为什么要这么做?为什么,当我不注册序列化程序时可以正常工作?
谢谢。
【问题讨论】:
标签: c# .net mongodb mongodb-.net-driver