Custom Generic Mongo C # Serializer не вызывается, когда поле не включено в проекцию - PullRequest
0 голосов
/ 21 февраля 2019

Мой универсальный сериализатор не вызывается, когда свойство не включено в проекцию из 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)] *

...