Можно ли создать суррогат сериализации для LinkedList KeyValuePairs в C#? - PullRequest
0 голосов
/ 12 марта 2020

В настоящее время пытаюсь внедрить систему сохранения и загрузки в единый проект, чтобы иметь возможность сохранять и перезагружать состояния игры. Проект похож на настольную карточную игру, где есть карты и стопки карт. Стопки карт содержат LinkedList KeyValuePairs с каждым узлом, содержащим карту, и ее ориентацией в стопке (true = вверх, false = вниз). Это выглядит так:

LinkedList<KeyValuePairs<Cards,bool>> cardsList

Мы уже правильно сохраняем положение, вращение и тип объектов в проекте, используя суррогаты сериализации, список карточек в них не сохраняется Однако. Как нам go создать суррогат сериализации для такого рода LinkedList, который необходим для сохранения и загрузки? Мы пытались реализовать это по-разному, но до сих пор не повезло, любая помощь будет признательна.

Редактировать: Извините, забыл упомянуть, что мы используем двоичный форматер для этого и не XML

1 Ответ

0 голосов
/ 13 марта 2020

Спасибо за ответы, нам удалось решить проблему, создав собственный суррогат сериализации связанного списка, который перебирает связанный список и сохраняет каждый узел в файл, используя уникальную ссылку на основе позиции в списке. При загрузке данных из файла мы можем использовать ту же уникальную ссылку, чтобы получить правильные узлы в правильном порядке. Ниже приведены фрагменты кода, чтобы показать, как мы это сделали (мы понимаем, что это, вероятно, не самый эффективный способ, но он работает для наших нужд):

Сохранение данных в файл:

   `int num = 0;
    info.AddValue("count", cardsList.Count);
    foreach (KeyValuePair<Cards,bool> el in cardsList){
        info.AddValue(num + "id", el.Key.ID);
        info.AddValue(num + "faceUp", el.Value);
        num++;
    }`

Загрузка данных из файла:

   `int count = (int)info.GetValue("count", typeof(int));
    string id = "";
    bool faceUp;
    for (int i = 0; i < count; i++)
    {
        id = (string)info.GetValue(i + "id", typeof(string));
        faceUp = (bool)info.GetValue(i + "faceUp", typeof(bool));
        linkedList.AddLast(new KeyValuePair<Cards,bool>(gameController.FindCard(id), faceUp));
    }`
...