Разработка программного обеспечения – это непростая задача, особенно для новичков. Им предстоит выучить множество особенностей, инструментов и функций, чтобы на выходе получать качественный софт.
Программирование осуществляется с помощью специальных языков. Каждый обладает ключевыми особенностями, преимуществами, недостатками и нюансами. Основная масса современных ЯП универсальны – могут применяться как для веб-коддинга, так и для игрового софта. Согласно Google, огромным спросом пользуются языки СИ-семейства, Java, а также Python.
Хорошие разработчики должны разбираться не только в ключевых моментах создания ПО, но и в более сложных структурах процесса. В данной статье речь зайдет о таких манипуляциях как сериализация и десериализация объектов. Также будут рассмотрены наглядные примеры софта, объясняющие каждый процесс более подробно и детально.
Основные термины и понятия
Разработка – процесс, требующий определенных общих знаний. В программировании есть общие понятия, о которых необходимо помнить каждому юзеру, желающему создать собственное программное обеспечение:
- Алгоритм – инструкции, правила и указания, направленные на решение той или ной задачи.
- API – правила, принципы, протоколы и процедуры, направленные на помощь в создании программных приложений. Такой интерфейс способствует упрощению контактирования со сторонними службами и утилитами.
- Аргументы – значения, которые передаются в функции или команды.
- Ошибка – дефект или непредвиденный крах, приводящий к неисправностям в написанном коде.
- Символ – элементарная единица записи (отображения данных), которая выражена одной буквенной или цифирной записи.
- Объекты – связанные переменные, константы, а также иные структурные данные. Они будут выбираться и проходить совместную обработку при исполнении приложения.
- Объектно-ориентированное программирование – способ написания ПО, в основе которого заложены объекты и данные. Действия и логика присутствуют, но уходят на второй план.
- Класс – набор связанных между собой объектов, наделенных одними и теми же свойствами. Предназначается для гибкости программирования.
- Константа – неизменное значение. Оно остается одинаковым на протяжении всего цикла приложения.
- Тип данных – классификация определенной разновидности типа.
- Массив – множество схожих типов данных, подвергшихся предварительной группировке.
- Итерация – один проход через определенный набор операций в коде.
- Ключевое слово – зарезервированное языком программирования или утилитой слово. Необходимо для выполнения тех или иных задач, реализации команд. Ключевики не могут выступать в виде названий переменных.
- Переменная – единица хранения информации в памяти устройства, которая имеет собственное уникальное имя.
- Операнд – то, чем можно управлять через операторы.
- Оператор – объект, который при помощи операндов управляет другими составляющими кода в заданном выражении.
- Указатель – переменная, хранящая в себе адрес места в памяти.
Это – база, без которой невозможно успешно коддить, а также рассматривать сериализации и десериализации. Отыскать подобные определения успешно удастся через Google. Также стоит учесть, что у каждого ЯП есть «специфические» термины, используемые для конкретного способа написания ПО.
Актуальность темы
Сериализация объектов в языках программирования (будут рассмотрены примеры из Java и Python) – механизм, который помогает разрабам создать уникальное ПО, которое умеет «запоминать» собственное состояние.
Пример – это компьютерная игра. Даже на приставках из 90-х были такие операции как «сохранение» и «загрузка». Но не везде. Из-за этого возникали определенности трудности. Особенно если речь заходила не просто об играх, а о «серьезном» программном обеспечении.
Сохранение и загрузка игры в обычном понимании (и, если посмотреть Google) – это продолжение с того места, где клиент закончил в прошлый раз. Для этого будет создана специальная «контрольная точка». Она задействуется при следующей загрузке ПО. Так процесс звучит в «обыденном» смысле.
В программировании ситуация обстоит аналогичным образом. Процесс можно описать следующим образом:
- Пользователь работает с утилитой и производит какие-то изменения.
- Когда нужно – пытается сохранить состояние программы.
- Информацию о приложении требуется как-то записывать, чтобы в будущем можно было произвести восстановление прогресса. Для этого нужны специальные механизмы.
Именно к этим операциям будет обращаться пользователь, когда ему требуется загрузить или выгрузить то или иное состояние контента. Манипуляции способствуют продолжению работы клиента.
Сериализация и десериализация – общее
Сериализация имеющихся объектов – это процесс сохранения состояния объекта в последовательность байт. Механизм, который позволят «записывать» полученный прогресс для будущей выгрузки.
Десериализация – восстановление объектов из байт, сохранение которых было произведено ранее. Процедура выгрузки «зафиксированной» информации пользователем.
В Java и Python любые объекты, согласно Google, проходят через преобразование в байт последовательность. Это важный процесс, без которого существование современного ПО оказалось бы невозможным.
Для чего требуется
Программные коды не могут существовать сами по себе. Они обычно взаимодействуют друг с другом, а также обмениваются данными. Байтовый формат – это удобное и эффективное средство хранение информации в памяти. Он позволяет превращать объекты (пример – класс SaveGame – сохраненная игра) в последовательность байт. Далее – передать их через интернет на другое устройство (компьютер, смартфон, планшет), а после превратить соответствующие bytes в объект Java или Python.
Из вышесказанного следует, что, когда данные сериализованы, ими удобно пользоваться на разных девайсах. Такой подход позволяет машине воспринимать информацию в виде простого для «осознания» устройства способа представления.
Сериализация соответствующих объектов очень удобна, когда речь идет о работе со сложными компонентами при коддинге. Это способствует созданию качественного ПО.
В Java
Стоит рассмотреть описанные операции на примере двух самых популярных ЯП. Начать лучше с Java, который является более функциональным и универсальным. С его помощью могут быть написаны даже сложные игры и «офисные» приложения.
В Java, согласно Google, сервиализация возможна лишь относительно объектов, которые используют интерфейс Serializable. Он:
- не служит для определения тех или иных методов;
- выступает в качестве своеобразного системного указателя;
- «ссылается» на то, что объект, который его реализовывает, может быть сериализован.
Сериализация в Java – это своеобразное представление информации в байтах ссылками через специальный класс.
Класс ObjectOutputStream
Для того, чтобы сериализуемый набор объектов был «собран» в поток, необходимо применить class Object Output Stream (пишется слитно). Он отвечает за потоковую запись информации.
Чтобы создать подобный объект, согласно Google, требуется использовать такую форму представления в конструкторе: ObjectOutputStream (OutputStream out).
Запись электронных материалов упомянутым классом ведется за счет определенных методов. Они включают в себя следующие вариации:
- void close() – закрытие потока;
- void flush() – очистка буфера и сброс содержимого в выходной поток;
- write(byte[] buf) – запись в поток массив байтов;
- write (int val) – преобразование один младший байт из val;
- writeBoolean(int val) – работа с булевым значением;
- writeByte(int val) – сохранение в поток один младший байт из val;
- writeChar(int val) – значение типа char, которое представлено целочисленным;
- writeDouble – значение типа double;
- writeLong – тип long;
- writeInt – целочисленный тип данных int;
- writeShort – запись типа short;
- writeUTF(String str) – записывает в поток строку, которая идет в кодировке UTF-8;
- writeObject(Object obj) – запись в поток отдельного объекта.
Согласно Google, все предложенные методы – это информация, с которой допускается провести сериализацию в Java.
Пример
Чтобы лучше понимать соответствующее направление, стоит рассмотреть наглядный пример. Вот файл с кодом, в который хотим сохранить один объект класса Person:
import java.io.*;
public class Program {
public static void main(String[] args) {
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat")))
{
Person p = new Person("Sam", 33, 178, true);
oos.writeObject(p);
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
class Person implements Serializable{
private String name;
private int age;
private double height;
private boolean married;
Person(String n, int a, double h, boolean m){
name=n;
age=a;
height=h;
married=m;
}
String getName() {return name;}
int getAge(){ return age;}
double getHeight(){return height;}
boolean getMarried(){return married;}
}
Он наглядно отражает сериализацию объектов в программировании на примере Джавы. Подобный приложения можно с легкостью обнаружить в Google.
Десериализация
В Джаве есть обратный от упомянутого ранее класс. Это – ObjectInputStream. Он позволяет провести чтение электронных материалов, которые были serialized ранее. Принимает ссылку в имеющемся конструкторе на поток ввода: ObjectInputStream(InputStream in).
А вот методы, которые использует соответствующий класс:
Из ранее созданного класса, прошедшего serializing, можно извлечь электронные материалы:
А теперь можно объединить эти файлы (serialization и deserialization) в единый документ и вывести по полям списка объектов:
Исключение
Изначально при сериализации рассматриваемых объектов в ЯП, согласно Google, будут использоваться все переменные object. Но бывают случаи, когда некоторые поля требуется исключить. Это можно сделать при помощи модификатора.
В соответствующей ситуации предстоит запомнить, что:
- Название необходимого модификатора – это transient.
- Если взять наглядный пример с Person, можно исключить из него переменные height.
- Убрать разрешается несколько элементов. Пример – дополнительно из Person исключим married.
Выше – сериализация заданных объектов с исключениями. Подобных примеров в Google тоже немало. И все они способны разъяснить процесс serialize даже новичкам.
В Питоне
В случае с Питоном ситуация обстоит несколько иначе. Далее будут приведены примеры со средой разработки IntelJ IDEA со стандартным расширением от JetBrains.
Чтобы успешно проверить сериализацию в Python, необходимо произвести импорт модулей. А еще – создать таблицу информации, с которой будет осуществляться дальнейшая работа.
Инструменты Питона
У Питона не one способ реализации рассматриваемой операции. Их несколько:
- NumPy. Он будет вести запись массива в файл в качестве одномерного. Реализовывается через метод np/ndarray.tolist().
- Google также указывает на то, что есть Pandas, который будет использовать похожий интерфейс. Здесь предусмотрен более широкий функционал. Запись – через метод pd.DataFrame.to_csv(), чтение – pd.read_csv().
- Согласно Google, можно реализовать поставленную задачу через JSON. Для этого требуются функции load и dump.
- Pickle – если верить Google, представлен стандартной библиотекой, похожей на JSON.
Все это поможет лучше разобраться с соответствующей тематикой. В Google полно разнообразной документации как по Питону, так и по Джаве. И вот один из примеров.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!