Всем привет! Скоро в универе будем проходить сериализацию и будет лабораторная работа с такой темой. Среди вопросов будет тема про различие сериализации и потоковой записи. Хочу быть заранее подкованным, так сказать. Поясните с примерами кода и комментариями, пожалуйста.
Здравствуй.
Скажу сразу, что сериализация сохраняет информацию об объекте, при этом сохраняя его состояние. Простая потоковая запись в файл осуществляется путём преобразования данных в бинарное представление и просто запись битов в определённое место. После записи, логично, нам когда-нибудь потребуется считать данные, которые мы записали.
И вот тут вот начинается самое интересное. Может возникнуть вопрос, зачем нам сохранять состояние, если у нас есть точный набор ноликов и единичек, которые фактически представляют нам все данные?
Вот представь себе ситуацию: ты играешь в игрушку, бегаешь там, мочишь всех направо-налево, и тут тебе срочно нужно отойти куда-то (в туалет, например). Тебе нужно приостановить игру (а то и выйти из неё). Ты без проблем открываешь менюшку, сохраняешь текущий прогресс и со спокойной душой отлучаешься по делам.
Вот сериализация для того и нужна, что б ты мог сохранить прогресс. На момент выхода у тебя там оставалась какая-то динамическая полоска 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>