. Net MongoDB десериализационный реквизит на основе интерфейса - PullRequest
2 голосов
/ 04 мая 2020

У меня есть пара классов, помеченных интерфейсом. пример ::1001*

public class Example1 : IExample {}

public class Example2 : IExample {}

На моем мастер-классе у меня есть реквизит примера, но он объявлен как интерфейс. напр .:

public class Master
{
  public string Company { get; set; }

  public IExample Examples { get; set; }
}

Для записи в пн go работает нормально, пн go добавляет реквизит с именем класса, подписанным интерфейсом, напр. Пример1 или Пример2

Но десериализация не работает вообще. Выдает ошибку:

Exception thrown: 'System.FormatException' in MongoDB.Bson.dll: 'An error occurred while deserializing the Source property of class Audit.Processed: Unknown discriminator value 'Example1'.'

Нужно ли что-то регистрировать или добавлять какой-либо атрибут чего-либо в Mon go, понимающий этот класс? Почему вставка работает?

Я нашел другие посты, подобные этой ( Десериализация полиморфных c типов с MongoDB C# Driver ), но все они говорят о базовых классах и не Interface как свойство.

Работало, как сказал проверенный пост, но мне пришлось создать класс stati c, иначе выкинуло бы исключение, сообщающее, что оно уже зарегистрировано. Вот рабочий код:

public class ClassMapRegisterer
{
    static ClassMapRegisterer()
    {
        BsonClassMap.RegisterClassMap<Example1>();
    }

    public static void RegisterClassMaps()
    {            
    }
}

Прежде чем открывать соединение, просто наберите:

ClassMapRegisterer.RegisterClassMaps();

cheers

1 Ответ

1 голос
/ 05 мая 2020

Согласно документации :

Если вы когда-либо видите сообщение об ошибке «Неизвестный дискриминатор», это потому, что десериализатор не может определить класс для этого дискриминатор. Если вы отображаете свои классы программно, просто убедитесь, что все классы в иерархии были сопоставлены до начала десериализации.

Вы не можете использовать атрибут BsonKnowTypes, поскольку он ограничен классами и строит у вас есть интерфейс, но вы можете использовать RegisterClassMap:

BsonClassMap.RegisterClassMap<Example1>();
BsonClassMap.RegisterClassMap<Example2>();
...