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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2014, 20:11   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию Сортировка массива объектов по заданному полю и запись их в бинарный файл

Привет!

У меня есть два примера. В одном я реализовал сортировку обычного массива по заданному полю: http://codepad.org/lhZjRC9h

А в другом примере, реализована запись List объектов в бинарный файл: http://codepad.org/Kynck94U

Пример взят отсюда: http://www.sharp-blog.ru/Serializaci...jl-csharp.html

Теперь мне нужно переделать первый пример так, чтобы была запись в бинарный файл. Но там обычный массив, а во втором примере List. Вот что лучше сделать: переделать сортировку под List или сделать запись в бинарный файл для обычного массива?

Подробнее о первом примере:

Реализовал сортировку массива объектов по заданному полю. Пользователю предлагается ввести лекарства (название, цена и т.д.). Для этого он вводит команду: add. После ввода нескольких лекарств, он может отсортировать их по заданному полю.

После ввода команды help:
Цитата:
Enter a command: help
add
show
del
clear
sort -price -asc
sort -price -desk
sort -name -asc
sort -name- desc
sort -num -asc
sort -num -desc
sort -type -asc
sort -type -desc

Enter a command:
8Observer8 вне форума Ответить с цитированием
Старый 19.02.2014, 01:01   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

BinaryFormatter - и хоть список, хоть массив. В бинарный файл (в качестве выходного потока указать файловый поток) писать и то и то будет одинаково удобно. Ну и читать соответственно
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 19.02.2014, 14:27   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Спасибо за ответ!

Для удобства:
- класс со студентами (студенты в List, их можно записать в файл) http://codepad.org/Kynck94U
- класс с лекарствами объекты, которого нужно записать в файл (массив Remedy[]): http://codepad.org/lhZjRC9h

Чтобы объект можно было записать в файл, нужно унаследовать от ISerializable:

Код:
    [Serializable]
    public class Student : ISerializable
    {
    }
Но у меня класс с Remedy уже наследует от Medicine:

Код:
    class Remedy : Medicine
    {
    }
В C# же нет множественного наследования? Как быть?
8Observer8 вне форума Ответить с цитированием
Старый 19.02.2014, 14:36   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
В C# же нет множественного наследования? Как быть?
ISerializable не класс, а интерфейс.
итого, класс может имеет одного предка и может иметь множество реализаций интерфейсов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.02.2014, 14:39   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Спасибо!

Но если я так пишу, то двоеточие подчёркивается красным:

Код:
    [Serializable]
    class Remedy : Medicine : ISerializable
    {
    }
8Observer8 вне форума Ответить с цитированием
Старый 19.02.2014, 14:40   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Чтобы объект можно было записать в файл, нужно унаследовать от ISerializable:
Совсем необязательно, атрибута [Serializable] вполне достаточно

Цитата:
В C# же нет множественного наследования? Как быть?
Нет множественного наследования классов. На интерфейсы сие не распространяется. Тем более, что и реализовывать интерфейс ISerializable необязательно

Код:
                         
                //  ЗАПИСЬ

                List<Student> objectToSerialize = new List<Student>();
                // ... добавляем туда студентов ...
                using (FileStream fs = File.Create(@"C:\SerializationTest.bin"))
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(fs, objectToSerialize);
                }


                //ЧТЕНИЕ
                List<Student> result = null;
                using (FileStream fs = File.OpenRead(@"C:\SerializationTest.bin"))
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    result = formatter.Deserialize(fs) as List<Student>;
                }
P.S. Наследуемые интерфейсы перечисляются через запятую, а не через двоеточие. Двоеточие только одно
P.P.S. List<Student> можно завернуть в класс-обертку, удобнее будет. Ну и атрибут [Serializable] можно будет поставить.
Код:
    [Serializable]
    public class StudentsStorage
    {
        private static readonly BinaryFormatter _formatter = new BinaryFormatter();

        private List<Student> Students { get; set; }

        public void WriteToFile(string fileName)
        {
            using (FileStream fs = File.Create(fileName))
            {
                _formatter.Serialize(fs, this);
            }
        }

        public static StudentsStorage ReadFromFile(string fileName)
        {
            using (FileStream fs = File.OpenRead(fileName))
            {
                return _formatter.Deserialize(fs) as StudentsStorage;
            }
        }
    }
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 19.02.2014 в 14:47.
Luuzuk вне форума Ответить с цитированием
Старый 19.02.2014, 14:58   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Спасибо огромное! Это бы здорово облегчило жизнь, но объекты сохраняются в файл, но не загружаются.

Код:
    [Serializable]
    class Medicine : IComparable
    {
    }
Код:
    [Serializable]
    class Remedy : Medicine
    {
    }
Код:
                    case "save":
                        /*
                        Console.Write("Enter a file name: ");
                        string fileName = Console.ReadLine();
                        Console.WriteLine("fileName: " + fileName);
                        */

                        using (FileStream fs = File.Create(@"C:\SerializationTest.bin"))
                        {
                            BinaryFormatter formatter = new BinaryFormatter();
                            formatter.Serialize(fs, med);
                        }
                        break;

                    case "load":
                        /*
                        Console.Write("Enter a file name: ");
                        fileName = Console.ReadLine();
                        Console.WriteLine("fileName: " + fileName);
                        */

                        using (FileStream fs = File.OpenRead(@"C:\SerializationTest.bin"))
                        {
                            BinaryFormatter formatter = new BinaryFormatter();
                            med = formatter.Deserialize(fs) as Remedy[];
                        }
                        break;
8Observer8 вне форума Ответить с цитированием
Старый 19.02.2014, 15:05   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
formatter.Serialize(fs, med);
в med в этот момент точно лежит Remedy[] ?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 19.02.2014, 15:10   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я ввожу лекарства и комадну savе: http://codepad.org/0sHBBAN4
8Observer8 вне форума Ответить с цитированием
Старый 19.02.2014, 15:27   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Добавил в case: nmed = med.Count();

Код:
                    case "load":
                        /*
                        Console.Write("Enter a file name: ");
                        fileName = Console.ReadLine();
                        Console.WriteLine("fileName: " + fileName);
                        */

                        using (FileStream fs = File.OpenRead(@"C:\SerializationTest.bin"))
                        {
                            BinaryFormatter formatter = new BinaryFormatter();
                            med = formatter.Deserialize(fs) as Remedy[];
                        }
                        nmed = med.Count();
                        break;
После перезапуска и команды load. Выводит на экран, но выдаёт исключение:
Цитата:
Object reference not set to an instance of an object.
На стороке:
Код:
med[i].show();
Вот в этом коде:

Код:
                    case "show":
                        if (nmed == 0)
                        {
                            Console.WriteLine("List is empty.");
                        }
                        else
                        {
                            Console.WriteLine("");
                            Console.WriteLine("List of medicine: ");

                            for (int i = 0; i < nmed; i++)
                            {
                                med[i].show();
                            }

                        } 
                        break;
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в бинарный файл структуры Стремящийся Visual C++ 1 18.03.2012 13:01
запись в бинарный файл Shepard90 Общие вопросы C/C++ 2 28.06.2011 08:59
с++ запись в бинарный файл ofstream::write Farrel Общие вопросы C/C++ 1 25.11.2010 00:19
Чтение/запись массива объектов в файл MrBrain Общие вопросы .NET 0 08.06.2010 10:44
запись классов в бинарный файл Feannewedd Общие вопросы C/C++ 6 29.06.2009 10:11