Сериализация модели, которая наследуется от ObservableObject - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу сериализовать и десериализовать объект модели, который наследуется от MvvmLight.ObservableObject. Попытка десериализации объекта с помощью System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject выдает System.Runtime.Serialization.InvalidDataContractException с информацией о том, что базовый класс (т.е. MvvmLight.ObservableObject) не имеет DataContractAttribute или SerializableAttribute. Моя модель, которая не работает, выглядит следующим образом:

using GalaSoft.MvvmLight;

[DataContract]
public class MyModel : ObservableObject
{
  [IgnoreDataMember]
  private int _id;
  [DataMember]
  public int Id
  {
      get => _id;
      set => Set(ref _id, value);
  }
}

После удаления [DataContract] нет никаких исключений, но также нет десериализованных данных.

Решением может быть создание копии MyModel вызывается MyModelSerializable с теми же свойствами, но они не наследуются от ObservableObject и используют его для сериализации. После десериализации объекты MyModel могут быть созданы с данными объектов MyModelSerializable. Есть ли лучшее решение?

Редактировать: По запросу запрашивается ссылка на код GalaSoft.MvvmLight.ObservableObject: https://github.com/lbugnion/mvvmlight/blob/master/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(PCL)/ObservableObject.cs

1 Ответ

0 голосов
/ 07 ноября 2019

Вы не можете использовать Атрибут DataContract здесь, если вы не можете пометить ObservableObject с DataContract. Так что в вашем случае я думаю, что вы не можете пометить ObservableObject.

Вы должны создать другой класс с желаемыми элементами, которые вы хотите сериализовать без производного от класса ObservableObject

Возможно, вы могли бы реализовать (в другом сериализованномКласс с атрибутом DataContract, который видит MyModel) в вашем проекте:

    [OnSerializing]
    void PrepareForSerialization(StreamingContext sc)
    {
        //get items from MyModel and inject in new class serializable
    }
...