Краткая версия:
При использовании JsonConvert.PopulateObject в ObservableHashSet создается новый экземпляр HashSet (который нарушает наблюдаемое событие, ранее прикрепленное к нему), вместо заполнения HashSet с помощью метода Clear и Add.
Хотя, Тип ObservableHashSet реализует интерфейс IEnumerable, но, может быть, этого недостаточно? Если бы мне пришлось изменить класс, какой интерфейс он должен реализовать, чтобы десериализация правильно заполнила объект?
Пример
В качестве примера давайте рассмотрим следующее:
Код: Выделить всё
public class ContactLibrary
{
[JsonProperty] public ObservableHashSet
peoples = new ObservableHashSet();
}
public class People
{
public string name;
public People(string name)
{
this.name = name;
}
}
public class Main
{
public void TestMethod()
{
//Setup objects
ContactLibrary contacts = new ContactLibrary();
contacts.peoples.CollectionChanged += Peoples_CollectionChanged;
//Add a contact
contacts.peoples.Add(new People("Charlie")); //Trigger a CollectionChanged
//Save the current contacts using json serialization
string json_save = JsonConvert.SerializeObject(contacts);
//Add a new contact
contacts.peoples.Add(new People("Emma")); //Trigger a CollectionChanged
//Actually, revert back to cancel adding the last contact
JsonConvert.PopulateObject(json_save, contacts);
//Add a new contact
contacts.peoples.Add(new People("Emily")); //DOES NOT Trigger a CollectionChanged, because people got re-instantiated.
}
private void Peoples_CollectionChanged(INotifyCollectionChangedEventArgs e)
{
switch(e.Action)
{
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
Debug.Log("New people added : " + e.NewItem.name);
break;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... om-hashset
Мобильная версия