CSLA SerializationException в BeginEdit при использовании LazyGetPropertyAsync

Возникла проблема при использовании LazyGetPropertyAsync для бизнес-объекта, поэтому я привел несколько примеров кода, чтобы показать базовую структуру этой проблемы. Как только я вызываю BeginEdit (после выборки), я получаю следующее исключение SerializationException.

System.Runtime.Serialization.SerializationException: 'Тип' Csla.PropertyInfo`1 [[MyApp.ChildList, MyApp, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] 'в сборке' Csla, Version = 4.6.603.0 , Culture = нейтральный, PublicKeyToken = 93be5fdc093e4c30 'не помечен как сериализуемый'.

Этого не произойдет, если я заменю LazyGetPropertyAsync на LazyGetProperty, а затем использую метод syncronhous вместо async. Я также пробовал использовать LazyGetPropertyAsync ‹ChildList>, но все равно получаю исключение.

Что я здесь делаю не так?

    [Serializable]
    public class MyObject : BusinessBase<MyObject>
    {
         //readonly backing field here
         public ChildList Child
         {
             get
             {
                 return LazyGetPropertyAsync(ChildProperty, ChildList.FetchAsync());
             }
         }
    }

    [Serializable]
    public class ChildList : ReadOnlyListBase<ChildList, ChildObject>
    {
          public static ChildList Fetch()
          {
               //fetch here
          }

          public static async Task<ChildList> FetchAsync()
          {
               //fetch here
          }
    }

    [Serializable]
    public class ChildObject : ReadOnlyBase<ChildObject>
    {
         //some stuff here
    }

person Matt Conway    schedule 30.11.2017    source источник
comment
Проверьте свою недвижимость. Вы указали атрибут как NonSerializable. P.S. Да, я знаю, что он старый, но может кому-то помочь.   -  person arcticwhite    schedule 23.01.2018


Ответы (1)


Я подозреваю, что это ошибка в структуре Csla, которая сохраняет Task<T> в FieldManager, а не результат ожидания этого Task<T>.

person Andy    schedule 23.05.2018
comment
Приветствую за ответ. Я проверил определение функции для асинхронного метода: protected P LazyGetPropertyAsync<P>(PropertyInfo<P> property, Task<P> factory); Он определенно должен возвращать задачу, так что то, что у меня есть, верное. Попытка вернуть функцию приведет к ошибке, потому что это не тип делегата. Для неасинхронного эквивалента требуется Func ‹T›, поэтому здесь может возникнуть путаница. - person Matt Conway; 25.05.2018
comment
@MattConway Так оно и есть; Тогда я подозреваю, что это ошибка во фреймворке. - person Andy; 26.05.2018