Мой универсальный сериализатор не вызывается, когда свойство не включено в проекцию из Mongo.Вот мой класс, который сериализуется / десериализуется:
public class User : ServiceMongoIdentity
{
/// properties ommitted for brevity
[BsonIgnoreIfDefault]
[BsonSerializer(typeof (StringTypeBsonSerializer<LanguageCode>))]
[BsonDefaultValue(LanguageCode.EnUs)]
public LanguageCode Language { get; set; } = LanguageCode.EnUs;
}
var users = await userDataClient.UserCrud.GetAll(terryberryDataContext,nameof(User.Language));
для справки GetAll определяется следующим образом
Task<List<T>> GetAll(DataContext dataContext, params string[] includedfields);
Вот мой сериализатор
public class StringTypeBsonSerializer<T> : SerializerBase<T> where T:StringTypeBase<T>, new()
{
/// <summary>Deserializes a value.</summary>
/// <param name="context">The deserialization context.</param>
/// <param name="args">The deserialization args.</param>
/// <returns>A deserialized value.</returns>
public override T Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
if (context.Reader.CurrentBsonType != BsonType.String)
{
Console.WriteLine("returning");
return null;
}
T stringType = new T();
return stringType.FromString(context.Reader.ReadString());
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, T value)
{
context.Writer.WriteString(value.ToString());
}
}
этот код вызывает ошибку, поскольку я больше не проецирую поле с моим настраиваемым сериализатором
var users = await userDataClient.UserCrud.GetAll(terryberryDataContext);
System.InvalidCastException: Unable to cast object of type 'System.String' to type 'Terryberry.Users.Shared.Domain.Constants.LanguageCode'.
at lambda_method(Closure , Object , Object )
at MongoDB.Bson.Serialization.BsonMemberMap.ApplyDefaultValue(Object obj)
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
Для двух обходных путей требуется поле с BsonRequired или удаление [BsonDefaultValue (LanguageCode.EnUs)] *