Загрузка...

Десериализация

Тема в разделе C# создана пользователем Nonreyj 8 май 2023. 119 просмотров

Загрузка...
  1. Nonreyj
    Nonreyj Автор темы 8 май 2023 3 15 апр 2021
    мне нужно сделать сериализацию и десериализацию.

    Код
    string json = JsonConvert.SerializeObject(phones, Formatting.Indented);

    // зберігаємо результат серіалізації у файл
    File.WriteAllText("phones.json", json);
    Phone:
    Код
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace OOP
    {
    public abstract class Phone : IComparable<Phone>
    {
    public string name { get; set; }
    public string brand { get; set; }
    public int price { get; set; }

    public Phone(string name, string brand, int price)
    {
    this.name = name;
    this.brand = brand;
    this.price = price;
    }

    int IComparable<Phone>.CompareTo(Phone other)
    {
    return other.price.CompareTo(this.price);
    }
    /*public int CompareTo(Phone other)
    {
    return other.price.CompareTo(this.price);
    }*/

    }

    }
    MobPhone:
    Код
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace OOP
    {
    public class MobPhone : Phone
    {
    public string color { get; set; }
    public int memory { get; set; }

    public MobPhone(string name, string brand, int price, string color, int memory) : base(name, brand, price)
    {
    this.color = color;
    this.memory = memory;
    }

    }

    }
    RadioPhone:
    Код
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace OOP
    {
    public class RadioPhone : Phone
    {
    public double radius { get; set; }
    public bool hasAutoAnswer { get; set; }

    public RadioPhone(string name, string brand, int price, double radius, bool hasAutoAnswer) : base(name, brand, price)
    {
    this.radius = radius;
    this.hasAutoAnswer = hasAutoAnswer;
    }
    }

    }
    Создан List<Phone> phones = new List<Phone>(); и туда из файла загружаются телефоны. Как сделать проверку, какой клас нужно выбрать при десериализации?
     
  2. ChatGPT
    ChatGPT 8 май 2023 2253 14 мар 2023
    Nonreyj, вы можете добавить свойство "Type" в классы MobPhone и RadioPhone, которое будет указывать на тип объекта. Затем, при десериализации, вы сможете проверять это свойство и создавать объекты соответствующего типа. Вот пример:

    1. Добавьте свойство "Type" в классы MobPhone и RadioPhone:

    CSHARP

    public class MobPhone : Phone
    {
    public string Type { get; set; } = "MobPhone";
    // Остальные свойства и методы
    }

    public class RadioPhone : Phone
    {
    public string Type { get; set; } = "RadioPhone";
    // Остальные свойства и методы
    }
    2. При десериализации проверяйте свойство "Type" и создавайте объекты соответствующего типа:

    CSHARP

    using Newtonsoft.Json.Linq;

    // Чтение JSON из файла
    string json = File.ReadAllText("phones.json");

    // Десериализация JSON в массив объектов JObject
    JArray jsonArray = JArray.Parse(json);

    // Создание списка объектов Phone
    List<Phone> phones = new List<Phone>();

    foreach (JObject jsonObject in jsonArray)
    {
    // Определение типа объекта на основе свойства "Type"
    string type = jsonObject["Type"].ToString();

    if (type == "MobPhone")
    {
    MobPhone mobPhone = jsonObject.ToObject<MobPhone>();
    phones.Add(mobPhone);
    }
    else if (type == "RadioPhone")
    {
    RadioPhone radioPhone = jsonObject.ToObject<RadioPhone>();
    phones.Add(radioPhone);
    }
    }
    Теперь ваш список `phones` будет содержать объекты MobPhone и RadioPhone, восстановленные из JSON-файла.
     
  3. vtlstolyarov
    vtlstolyarov 9 май 2023 474 8 янв 2022
Top