Мне нужно save/serialize
класс, в котором некоторые свойства могут иметь геттеры, которые могут быть недоступны во время выполнения.В моем особом случае это ECS (Entity-Component-System) -Entities, которые собираются во время выполнения, и поэтому не все Component-Properties доступны во время выполнения.Если вы не знаете, что делает ECS, просто продолжайте читать, здесь проблема не имеет значения.Если вам интересно узнать, что такое ECS, просто посмотрите здесь: ECS Wikipedia
Например, есть такой класс Entity:
public class MyEntity
{
public PersonComponent person{get;set}
public bool hasPersonComponent{get;}
public AdressComponent adress{get;set;}
public bool hasAdressComponent{get;}
}
Итакон содержит два компонента и свойство bool для каждого компонента, которое возвращает true, если эти компоненты даже существуют во время выполнения.
И карта классов для сериализации этих объектов
BsonClassMap.RegisterClassMap<MyEntity>(cm =>
{
cm.AutoMap();
cm.MapMember(c => c.person);
cm.MapMember(c => c.adress);
});
MongoDB в настоящее время сериализуетсятолько эти классы сущностей, если все сопоставленные свойства существуют во время выполнения, так что все их получатели доступны.Если один из них отсутствует, MongoDB не сериализует весь класс и не сохраняется в БД.
Есть ли способ игнорировать эти свойства в serialization/saving
этого класса?
Я уже обнаружил, что это можно сделать с помощью конвенций, а также нашел SetShouldSerializeMethod
, но я не могу найти синтаксис для установки SetShouldSerializeMethod
для установки сериализации соответствующего элемента / свойства в значение false для данногоhasComponent == false
значение bool, которое является другим свойством того же класса.
Таким образом, псевдокод будет иметь вид:
if(!myEntity.hasPersonComponent) cm.MapMember(c => c.person).SetShouldSerialize(false);
if(!myEntity.hasAdressComponent) cm.MapMember(c => c.adress)SetShouldSerialize(false);
, но это определенно неправильный синтаксис.Я также предпочел бы сохранить все эти условные обозначения в так называемом классе ConventionsPack, но не могу найти примеров для его создания.
Заранее спасибо за помощь!