Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2015, 12:13   #1
vermond
Пользователь
 
Регистрация: 24.01.2014
Сообщений: 11
Лампочка [C#] Сериализация списка классов (нескольких классов)

Ув. форумчане. Знаю, что данный вопрос неоднократно поднимался и здесь существует огромное количество тем. Но у меня ситуация нестандартного характера и все никак не могу найти удачное и корректное решение. Надеюсь на вашу помощь!

В общем задача такова:

Нужно сделать сохранение классов с заполненными полями в файл, а затем сделать загрузку из файла этих данных.

Классы выглядят так:

Код:
[Serializable]
    public class CustomObject
    {
        public int id { get; set; }
        public string type { get; set; }
		public string inner_name { get; set; }
		public int speed {get; set;}
		public int height {get; set;}
		public int width {get; set;}
    }
	
    [Serializable]
    public class TheCar : CustomObject
    {
        public Color color {get; set;}
		public string mark {get; set;}
		// ...
        public TheCar()
        {
			// ...
        }
    }
	
	// ...
	
    public class ObjectsCache
    {
        static List<CustomObject> AllObjects { get; set; }

        static List<TheCar> Cars { get; set; }
        static List<ThePlane> Planes { get; set; }
        static List<TheShip> Ships { get; set; }
		
		// ...
		
		AllObjects = new List<CustomObject>();
		Cars = new List<TheCar>();
		Planes = new List<ThePlane>();
		Ships = new List<TheShip>();
		
		static int incrementId = 0;
		
		public static int NextId()
        {
            return ++incrementId;
        }
		
		public static void AddNewCar(TheCar car)
        {
            car.id = NextId();
            AllObjects.Add(car);
            Cars.Add(car);
        }
		
		// ...
	}
	
	public class GlobalVariables
    {
		public static string state { get; set; }
        public static string city { get; set; }
		public static string country { get; set; }
		public static int time { get; set; }
		
		// ...
    }
CustomObject - обобщенная модель (родитель для TheCar, TheShip, ThePlane)
TheCar, TheShip, ThePlane - соответственно наследуются от CustomObject, дополняя своими свойствами

При создании нового экземпляра любого из этих классов, обьект добавляется в список AllObjects а затем в список подходящий под свой тип (например Cars), по коду выше видно

Каждый класс содержит уникальный айди, который при создании обьекта инкрементируется и записывается через ObjectsCache.

***

Подводя итог, нужно сохранить в файл / загружать из файла (желательно все в одном файле)

1) списки классов:
static List<CustomObject> AllObjects { get; set; }
static List<TheCar> Cars { get; set; }
static List<ThePlane> Planes { get; set; }
static List<TheShip> Ships { get; set; }

2) Последний айди из ObjectsCache (т.е. значение incrementId)

3) А так же класс глобальных переменных GlobalVariables

Помогите пожалуйста!!!
vermond вне форума Ответить с цитированием
Старый 05.06.2015, 12:59   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от vermond Посмотреть сообщение
Подводя итог, нужно сохранить в файл / загружать из файла (желательно все в одном файле)

1) списки классов:
static List<CustomObject> AllObjects { get; set; }
static List<TheCar> Cars { get; set; }
static List<ThePlane> Planes { get; set; }
static List<TheShip> Ships { get; set; }

2) Последний айди из ObjectsCache (т.е. значение incrementId)

3) А так же класс глобальных переменных GlobalVariables

Помогите пожалуйста!!!
Так в чем конкретно проблема то??
Если все классы сериализуемы то можно собрать листы в массив объектов и сериализовать его.

Вот можете моим примером воспользоватся с архивацией.

Код:
/// <summary>
        /// Сохраняет конфигурацию модулей в файл
        /// </summary>
        /// <param name="Filename"></param>
        internal int SaveConfiguration(string Filename)
        {
            try
            {
                using (Stream stream = File.Open(Filename, FileMode.Create))
                {
                    using (GZipStream str = new System.IO.Compression.GZipStream(stream, CompressionMode.Compress))
                    {
// создаем новый список объектов
                        List<object> values = new List<object>();
                        values.Add(Modules); // добавляем любой объект в том числе и лист.  
                        values.Add(Dicts.NumsByAccount); // ...

                        BinaryFormatter bformatter = new BinaryFormatter();
                        bformatter.Serialize(str, values); // сериализуем
                        str.Close();
                    }
                    stream.Close();
                }
            }
            catch (Exception ex)
            {
                if (File.Exists(Filename)) File.Delete(Filename);
                return -1;
            }
            return 0;
        }


/// <summary>
        /// Загружает настройки из файла
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public int LoadConfiguration(string filename)
        {
            List<object> restored = null; // список восстановленных объектов
            try
            {
                using (Stream stream = File.Open(filename, FileMode.Open))
                {
                    using (GZipStream str = new System.IO.Compression.GZipStream(stream, CompressionMode.Decompress))
                    {
                        BinaryFormatter bformatter = new BinaryFormatter();
                        restored = (List<object>)bformatter.Deserialize(str);
                        str.Close();
                    }
                    stream.Close();
                }

// далее производите переброску объектов в ваши свойства               
                
            }
            catch (Exception ex)
            {
                return -1;
            }
            return 0;
        }
Как то так.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 06.06.2015, 14:05   #3
vermond
Пользователь
 
Регистрация: 24.01.2014
Сообщений: 11
По умолчанию

Спасибо огромное!

Подскажите, а как получить нужные поля и обьекты из restored обратно?
не могу сообразить

ObjectsCache.AllModules = restored.AllObjects; // список обьектов
ObjectsCache.Cars = restored.Cars; // обьект
ObjectsCache.incrementId = restored.incrementId; // поле

???

Последний раз редактировалось vermond; 06.06.2015 в 18:53.
vermond вне форума Ответить с цитированием
Старый 06.06.2015, 23:10   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от vermond Посмотреть сообщение
Спасибо огромное!

Подскажите, а как получить нужные поля и обьекты из restored обратно?
не могу сообразить

ObjectsCache.AllModules = restored.AllObjects; // список обьектов
ObjectsCache.Cars = restored.Cars; // обьект
ObjectsCache.incrementId = restored.incrementId; // поле

???
restored это список. Обращаться следует по индексу:

Код:
ObjectsCache.AllModules = (List<CustomObject>)restored[0]; // список обьектов
ObjectsCache.Cars = (List<TheCar>)restored[1]; // обьект
ObjectsCache.incrementId = (int)restored[2]; // поле
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ИЕРАРХИЯ КЛАССов DEVU Помощь студентам 2 15.05.2012 08:17
XML-сериализация проблемных классов (Font, Color, и т. д) ds.Dante Общие вопросы .NET 1 18.07.2011 20:12
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
агрегирование классов M_Yuri Общие вопросы Delphi 3 12.02.2008 18:31