Ошибка сериализации наследования репозитория MongoRepository
При попытке объединить наследование с MongoRepository для C# у меня возникают ошибки сериализации.
Действительно странная вещь - это работает в течение короткого времени, но после, скажем, перестройки или чего-то такого, что не получается. Если я урону коллекцию и создам новую, она будет работать до остановки или перестройки.
Мой код выглядит так:
public class Organization
{
// other attributes removed for demonstration simplicity
public List<Person> People { get;set; }
}
public abstract class Person
{
public string Id {get;set;}
public string Name {get;set;}
}
public class Employee : Person
{
public string Badge {get;set;}
}
public class Contractor : Person
{
public string Company {get;set;}
}
Когда я пытаюсь получить это как:
static MongoRepository<Organization> apps = new MongoRepository<Organization>();
return apps.Single(c => c.Id == id);
Я получаю ошибку:
Исключение типа "System.IO.FileFormatException" произошло в MongoDB.Driver.dll, но не было обработано в коде пользователя
Дополнительная информация: Произошла ошибка при десериализации свойства People класса API.Models.Organization: Экземпляры абстрактных классов не могут быть созданы.
2 ответа
Добавление атрибутов декоратора:
[BsonKnownTypes(typeof(Contractor), typeof(Employee))]
чтобы классы решили проблему.
Была похожая проблема, где Person
был абстрактный класс, унаследованный от другого абстрактного класса. Мне не понравилась идея добавить атрибуты Mongo в мою модель предметной области, и, немного поиграв с ней, обнаружил маркировку Person
Класс как корень делает его сериализованным и десериализованным должным образом:
BsonClassMap.RegisterClassMap<Person>(cm => {
cm.SetIsRootClass(true);
});
Обратите внимание, что исключение десериализации произошло, потому что драйвер MongoDB не устанавливал дискриминатор _t
поле.