Сериализация и потоковая запись в файл C#.

Всем привет! Скоро в универе будем проходить сериализацию и будет лабораторная работа с такой темой. Среди вопросов будет тема про различие сериализации и потоковой записи. Хочу быть заранее подкованным, так сказать. Поясните с примерами кода и комментариями, пожалуйста.

Здравствуй.

Скажу сразу, что сериализация сохраняет информацию об объекте, при этом сохраняя его состояние. Простая потоковая запись в файл осуществляется путём преобразования данных в бинарное представление и просто запись битов в определённое место. После записи, логично, нам когда-нибудь потребуется считать данные, которые мы записали.

И вот тут вот начинается самое интересное. Может возникнуть вопрос, зачем нам сохранять состояние, если у нас есть точный набор ноликов и единичек, которые фактически представляют нам все данные?

Вот представь себе ситуацию: ты играешь в игрушку, бегаешь там, мочишь всех направо-налево, и тут тебе срочно нужно отойти куда-то (в туалет, например). Тебе нужно приостановить игру (а то и выйти из неё). Ты без проблем открываешь менюшку, сохраняешь текущий прогресс и со спокойной душой отлучаешься по делам.

Вот сериализация для того и нужна, что б ты мог сохранить прогресс. На момент выхода у тебя там оставалась какая-то динамическая полоска HP. Короче говоря, с помощью сериализации ты можешь сохранить значение всех полей при выходе, а затем при десериализации вернуть эти значения.

Обыкновенная потоковая запись в файл записала бы просто набор битов, и в результате игровой прогресс был бы утерян (все поля вернулись бы в исходное положение, продолжать игру было бы невозможно). Это касательно теории. Пример кода будет очень небольшой под всей этой тирадой. Узнать намного больше о сериализации ты можешь на продвинутом курсе C# - C# Professional.

Навожу пример XML сериализации:

[Serializable] //Для сериализации нужно пометить сериализируемый класс специальным атрибутом
        class User
        {
            public string Name { get; set; }
            public string Surname { get; set; }
            public int Age { get; set; }
        public User() { }
        public User(string name, string surname, int age)
        {
            Name = name;
            Surname = surname;
            Age = age;
        }
        //Поля с модификатором доступа private будут игнорироваться
    }</pre>
static void Main(string[] args)
        {
            var user = new User("Petya", "Petrov", 18);//Объект для сериализации

            XmlSerializer formatter = new XmlSerializer(typeof(User));//Требуется явное указание //сериализируемого типа
            using (FileStream file = new FileStream("user.xml", FileMode.OpenOrCreate))//Настройка //места, куда всё будет сериализироваться
            {
                formatter.Serialize(file, user); // Сам процесс сериалации
            }

            using (FileStream file = new FileStream("user.xml", FileMode.OpenOrCreate))
            {
                User newUser = formatter.Deserialize(file) as User; //Десериализация объекта
            }
        }

Пример потоковой записи в файл:

static void Main(string[] args)
        {
            var user = new User("Petya", "Petrov", 18);
        string result = user.Name   " "   user.Surname   " "   user.Age;

        using (FileStream file = new FileStream("user.xml", FileMode.OpenOrCreate))
        {
            byte[] array = Encoding.Default.GetBytes(result);
            file.Write(array, 0, array.Length);
        }

        using (FileStream file = new FileStream("user.xml", FileMode.OpenOrCreate))
        {
            byte[] array = new byte[file.Length];

            file.Read(array, 0, array.Length);
            string textFromFile = Encoding.Default.GetString(array);
        }
    }</pre>