Привет, я пытаюсь добавить пользовательский сериализатор в свои классы mongo, и кажется, что он работает неправильно.
/>Цель состоит в том, чтобы у нас были древние события в базе данных, и я хочу прочитать их в «новом формате», который у нас есть.
Но ошибка происходит с новыми событиями . Вот структура
Код: Выделить всё
public abastract class FooBase
{
public int Version { get; set; }
public Guid AggregateId { get; set; }
//Other properties
public abstract object GetContent();
}
public class TypedFooBase : FooBase
where T : class
{
public T TypedContent { get; set; }
//Other properties
public override object GetContent()
{
return TypedContent;
}
}
Код: Выделить всё
public class BsonAncientEventSerializer : SerializerBase where T : class
{
public override TypedFooBase Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var serializer = BsonSerializer.LookupSerializer(typeof(ExpandoObject));
var obj = serializer.Deserialize(context);
string valueString = JsonConvert.SerializeObject(obj);
return JsonConvert.DeserializeObject(valueString, new Json.JsonAncientEventSerializer())
?? throw new Exception("something went wrong");
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TypedFooBase 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
();
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),
new BsonAncientEventSerializer()
);
Но когда я добавляю регистрацию сериализатора, код работает неправильно ;
Сериализация работает нормально (значения сохраняются в базе данных корректно);
А вот при чтении это не так работающий. Код вообще не останавливается в десериализации.
Коллекция, к которой я обращаюсь в коде, представляет собой IMongoCollection;
Затем, когда я выполняю Collection.Find(...).ToListAsync(), появляется ошибка «Невозможно создать абстрактный класс».
Это потому, что он пытается преобразовать значение в FooBase;
Но почему он это делает? А почему, когда я не регистрирую сериализатор работает нормально?
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/689 ... ract-class