Пользовательский сериализатор Mongo, вызывающий невозможность создания абстрактного классаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Пользовательский сериализатор Mongo, вызывающий невозможность создания абстрактного класса

Сообщение Anonymous »

Пользовательский сериализатор 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 : 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»