Десериализация JSON пользовательского HashSetC#

Место общения программистов C#
Ответить
Anonymous
 Десериализация JSON пользовательского HashSet

Сообщение Anonymous »

Я использую библиотеку C#, которая реализует собственный HashSet под названием ObservableHashSet. Более подробную информацию об этом можно найти здесь. А вот исходный код ObservableHashSet
Краткая версия:
При использовании 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;
}
}
}
Я использую строку json для хранения состояния экземпляра класса A и использую эту строку для восстановления предыдущего состояния. При этом JsonConvert.PopulateObject создает новый экземпляр поля ObservableHashSetpeoples, нарушая прослушиватель событий, который был настроен в первом экземпляре поля Peoples.


Подробнее здесь: https://stackoverflow.com/questions/798 ... om-hashset
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»