What is serialization in android

Русские Блоги

Android два метода сериализации Serializable и Parcelable

Что такое сериализация

Мы всегда говорим или слышим о «сериализации». Каково ее определение?

Сериализация (сериализация) Процесс преобразования информации о состоянии объекта в форму, которая может быть сохранена или передана. Во время сериализации объект записывает свое текущее состояние во временное или постоянное хранилище. Позже вы можете воссоздать объект, прочитав или десериализуя состояние объекта из области хранения.

Двоичная сериализация поддерживает точность типов, что полезно для сохранения состояния объектов между различными вызовами приложения. Например, сериализуя объект в буфер обмена, вы можете использовать его в разных приложениях. Вы можете сериализовать объекты в потоки, диски, память, сети и т. Д. Удаленное взаимодействие использует сериализацию для передачи объектов между компьютерами или доменами приложений «по значению».

Проще говоря, «сериализация» — это преобразование состояния объекта во время выполнения в двоичное, а затем сохранение его в потоке, в памяти или передача на другие терминалы по сети.

В разработке под Android мы часто используем Intent при передаче данных в компонентах. При передаче данных нам необходимо передать Serializable или Parcelable данные, такие как метод Intent.putExtra:

Binder также будет использоваться для передачи данных.

Сегодня я представлю эти два метода сериализации.

Сериализуемый интерфейс

Serializable — это интерфейс сериализации, предоставляемый Java, это пустой интерфейс:

Serializable используется для идентификации текущего класса, может быть ObjectOutputStream Сериализация и бытие ObjectInputStream Десериализация.

Serializable имеет следующие характеристики:

  • В сериализуемом классе состояние атрибута, которое не реализует Serializable, не может быть сериализовано / десериализовано
  • Другими словами, в процессе десериализации класса его несериализуемые свойства будут воссозданы путем вызова конструктора без параметров.
  • Следовательно, конструктор без параметров этого свойства должен быть доступен, иначе во время выполнения будет сообщено об ошибке.
  • Класс, реализующий сериализацию, и его подклассы также сериализуемы.

Ниже приведен класс сущности, реализующий Serializable:

Видно, что реализация Serializable очень проста, за исключением содержимого сущности, просто создайте его serialVersionUID Атрибуты в порядке.

serialVersionUID

По названию видно, что это serialVersionUID Что-то похожее на наш обычный номер версии интерфейса, который однозначно определяет сериализуемый класс во время выполнения.

Другими словами, когда класс сериализуется, его номер версии будет сохранен во время выполнения, а затем во время десериализации проверьте, совпадает ли номер версии объекта, который вы хотите десериализовать. Если он не согласован, будет сообщено об ошибке: · InvalidClassException 。

Если мы не создадим этот номер версии сами, среда выполнения вычислит номер версии по умолчанию на основе многих характеристик класса в процессе сериализации. Однако, если вы немного измените этот класс, номер версии изменится. Если это произойдет после сериализации, это вызовет вышеупомянутую ошибку во время десериализации.

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

Кроме того, статические и временные измененные атрибуты не сохраняются в процессе сериализации. Первый хорошо понятен, потому что статические атрибуты управляются классом и не принадлежат состоянию объекта; в то время как последний является ключевым словом Java, специально используемым для идентификации непоследовательности. Атрибуты.

Реализация Serializable по умолчанию не будет создана автоматически. serialVersionUID Атрибут, чтобы напоминать нам создавать вовремя serialVersionUID , Можно поискать в настройках serializable Затем выберите несколько вариантов, как показано на рисунке ниже, для тех, кто не заявил serialVersionUID Добавьте предупреждение для классов атрибутов и внутренних классов.

Читайте также:  Darkness rises промокод для андроида

Поэтому, когда мы создаем класс без объявления атрибута UID, на имени класса будет желтое предупреждение:

Содержимое предупреждения будет отображаться при наведении на него мыши:

GroupBean’ does not define a ‘serialVersionUID’ field less… (Ctrl+F1)
Reports any Serializable classes which do not provide a serialVersionUID field. Without a serialVersionUID field, any change to a class will make previously serialized versions unreadable.

В это время мы можем сгенерировать serialVersionUID, нажав комбинацию клавиш для запроса кода.

Сериализация и десериализация Serializable

Сериализация и десериализация Serializable выполняются через ObjectOutputStream и ObjectInputStream соответственно. Пример кода выглядит следующим образом:

Parcelable интерфейс

Parcelable — это интерфейс сериализации, уникальный для Android:

Классы, реализующие интерфейс Parcelable, будут преобразованы в при сериализации и десериализации. Parcel Тип данных.

Parcel является носителем, он может содержать ссылки на данные или объекты, а затем передаваться между процессами через IBinder.

Класс, реализующий интерфейс Parcelable, должен иметь статическую переменную типа CREATOR. Ниже приведен пример:

подводить итоги

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

Как правило, рекомендуется использовать Serializable при сохранении данных на SD-карту или передаче по сети.Хотя эффективность ниже, им легко пользоваться.

Рекомендуется использовать Parcelable для передачи данных во время выполнения, например Intent, Bundle и т. Д. Нижний уровень Android оптимизирован для обеспечения высокой эффективности.

Thanks

Перевод с: https://blog.csdn.net/u011240877/article/details/72455715

1. Что такое сериализация и десериализация?

(1) Объяснение терминов

Сериализация объекта: процесс преобразования объекта Java в байтовую последовательность и сохранения его на носителе.
Десериализация объектов: процесс восстановления последовательностей байтов в объекты Java.

(2) Подробное объяснение сериализации

Сериализация объектов включает три ключевых момента: объекты Java, последовательности байтов и хранилище.

1. Каков состав объектов Java?
Объекты Java содержат переменные и методы. Но сериализация и десериализация имеют дело только с переменными Java, а не с методами, а сериализация и десериализация имеют дело только с данными.

2. Что такое последовательность символов?
Последовательность символов состоит из двух слов, символ находится в поле компьютера и связи, а символ является единицей информации. Математически последовательность — это объект (или событие), расположенный в ряд.
«Персонажи-Википедия» ,«Последовательность-Википедия»Грубо говоря, это набор из нескольких последовательно расположенных персонажей. Похожие на «1A165613246546»

3. Магазин
Последовательность символов необходимо сохранить в одном месте, которым может быть жесткий диск или память.
Проще говоря: сериализация сохраняет информацию о текущем объекте. Десериализация — прямо противоположная операция.

Во-вторых, чем отличается Java-объект от сериализации Java-объекта?

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

3. Зачем использовать сериализацию и десериализацию?

Основываясь на вышеупомянутом понимании сериализации и десериализации, этот вопрос можно перевести на вопрос: почему мне нужно сохранять информацию об объекте на носителе данных и читать ее позже?
Из-за объяснения во втором случае необходимо получить указанный объект Java, когда JVM не запущена или на JVM других машин.

1. Используйте RMI (удаленный вызов метода)

2. Передача объектов в сети (Java Beans)

3. Глубокая копия объекта (включая сеть отношений между объектами, содержащуюся в текущем объекте)

Читайте также:  What is люди com samsung android service peoplestripe android

4. В чем разница между Serializable и Parcelable в Android?

Оба используются для поддержки операций сериализации и десериализации. Самая большая разница между ними — это разница в носителях. Serializable использует ввод-вывод для чтения, записи и хранения на жестком диске, тогда как Parcelable читает и записывает непосредственно в память. Очевидно, что память Скорость чтения и записи обычно выше, чем у ввода-вывода, поэтому в Android обычно предпочтительнее использовать Parcelable.
Сериализуемость не в центре внимания, но вы можете проверить«Анализ алгоритмов сериализации Java»В этой статье реализован простой пример Serializable: просмотрите файл ввода-вывода, сгенерированный сериализацией, прочтите его в шестнадцатеричном формате и по очереди объясните значение каждого шестнадцатеричного числа.

Пять, пример Parcelable

Класс, реализующий интерфейс Parcelable в Android, может поддерживать последовательность и десериализацию. Ниже приведен пример реализации:
1. Реализуйте интерфейс Parcelable.
2. Добавьте атрибуты сущности
3. Переопределите метод writeToParcel (Parcel dest, int flags), чтобы указать данные, которые будут записаны в класс Parcel.
4. Создайте статический объект Parcelable.Creator, есть два метода createFromParcel (Parcel in) и newArray (int size), первый указывает, как читать объекты данных из Parcel, второй создает Массив.
5. Переопределите метод describeContents и верните 0 по умолчанию.

public class Gril implements Parcelable <

private int mAge; // возраст

private boolean mSexy; // Это сексуально

public void writeToParcel(Parcel dest, int flags) <

dest.writeByte((byte) (mSexy ? 1 : 0));

public static final Parcelable.Creator CREATOR = new Parcelable.Creator () <

public Gril createFromParcel(Parcel in) <

Gril gril = new Gril();

gril.mSexy = in.readByte() != 0;

public Gril[] newArray(int size) <

return new Gril[size];

public int describeContents() <

Шесть, принцип посылки

Как видно из приведенного выше примера, конкретная запись (dest.writeInt (mAge);) и чтение (gril.mAge = in.readInt ();) — это все операции, выполняемые над объектом Parcel, опубликованным ниже. Это определение Parcle для чтения и записи данных типа int.

public final class Parcel <

* Write an integer value into the parcel at the current dataPosition(),

* growing dataCapacity() if needed.

public final native void writeInt(int val);

* Read an integer value from the parcel at the current dataPosition().

public final native int readInt();

Из приведенного выше кода видно, что все описания собственных методов используют JNI, а конкретное местоположение — system / frameworks / base / core / jni / android_util_Binder.cpp. Далее также в качестве примера используется чтение и запись типа int.

static void android_os_Parcel_writeInt(JNIEnv* env, jobject clazz, jint val)

Parcel* parcel = parcelForJavaObject(env, clazz);

if (parcel != NULL) <

const status_t err = parcel->writeInt32(val);

if (err != NO_ERROR) <

jniThrowException(env, «java/lang/OutOfMemoryError», NULL);

static jint android_os_Parcel_readInt(JNIEnv* env, jobject clazz)

Parcel* parcel = parcelForJavaObject(env, clazz);

if (parcel != NULL) <

Из вышеизложенного видно, что вызывается реализация Parcel и вызываются функции writeInt32 и readInt32 соответственно, а затем давайте посмотрим на конкретную реализацию. Расположение: /system/frameworks/base/libs/binder/Parcel.cpp

status_t Parcel::writeInt32(int32_t val)

status_t Parcel::writeAligned(T val) <

*reinterpret_cast (mData+mDataPos) = val;

status_t err = growData(sizeof(val));

if (err == NO_ERROR) goto restart_write;

status_t Parcel::readInt32(int32_t *pArg) const

status_t Parcel::readAligned(T *pArg) const <

const void* data = mData+mDataPos;

*pArg = *reinterpret_cast (data);

Следующие 4 балла взяты из«Изучение механизма отправки посылок в Android (часть 1)»
Заинтересованные друзья могут прочитать его сами. Это несложно понять. Вот краткое изложение основных идей:
1. Все чтение и запись выполняются в памяти, в основном с помощью malloc (), realloc (), memcpy () и других операций с памятью, поэтому это более эффективно, чем использование external в сериализации JAVA. Память будет намного выше;
2. При чтении и записи он выравнивается по 4 байтам, вы можете видеть, что #define PAD_SIZE (s) (((s) +3) &

3) выполняет определение макроса это дело;
3. Если предварительно выделенного места недостаточно, newSize = ((mDataSize + len) * 3) / 2; сразу выделит на 50% больше;

4. Для обычных данных используется адрес памяти mData, а для данных типа IBinder и FileDescriptor используется адрес памяти mObjects. Последнее достигается с помощью flatten_binder () и unflatten_binder (), цель состоит в том, что объект, прочитанный во время десериализации, является исходным объектом без необходимости обновлять новый объект.

Читайте также:  Дополненная реальность для андроид камеры

Семь, сериализация и десериализация Parcelable эксперимент?

Источник

Serialization and Deserialization in Java with Example

Serialization is a mechanism of converting the state of an object into a byte stream. Deserialization is the reverse process where the byte stream is used to recreate the actual Java object in memory. This mechanism is used to persist the object.

Attention reader! Don’t stop learning now. Get hold of all the important Java Foundation and Collections concepts with the Fundamentals of Java and Java Collections Course at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer Complete Interview Preparation Course.

The byte stream created is platform independent. So, the object serialized on one platform can be deserialized on a different platform.

To make a Java object serializable we implement the java.io.Serializable interface.
The ObjectOutputStream class contains writeObject() method for serializing an Object.

The ObjectInputStream class contains readObject() method for deserializing an object.

Advantages of Serialization
1. To save/persist state of an object.
2. To travel an object across a network.

Only the objects of those classes can be serialized which are implementing java.io.Serializable interface.
Serializable is a marker interface (has no data member and method). It is used to “mark” java classes so that objects of these classes may get certain capability. Other examples of marker interfaces are:- Cloneable and Remote.

Points to remember
1. If a parent class has implemented Serializable interface then child class doesn’t need to implement it but vice-versa is not true.
2. Only non-static data members are saved via Serialization process.
3. Static data members and transient data members are not saved via Serialization process.So, if you don’t want to save value of a non-static data member then make it transient.
4. Constructor of object is never called when an object is deserialized.
5. Associated objects must be implementing Serializable interface.
Example :

SerialVersionUID
The Serialization runtime associates a version number with each Serializable class called a SerialVersionUID, which is used during Deserialization to verify that sender and receiver of a serialized object have loaded classes for that object which are compatible with respect to serialization. If the receiver has loaded a class for the object that has different UID than that of corresponding sender’s class, the Deserialization will result in an InvalidClassException. A Serializable class can declare its own UID explicitly by declaring a field name.
It must be static, final and of type long.
i.e- ANY-ACCESS-MODIFIER static final long serialVersionUID=42L;

If a serializable class doesn’t explicitly declare a serialVersionUID, then the serialization runtime will calculate a default one for that class based on various aspects of class, as described in Java Object Serialization Specification. However it is strongly recommended that all serializable classes explicitly declare serialVersionUID value, since its computation is highly sensitive to class details that may vary depending on compiler implementations, any change in class or using different id may affect the serialized data.

It is also recommended to use private modifier for UID since it is not useful as inherited member.

serialver
The serialver is a tool that comes with JDK. It is used to get serialVersionUID number for Java classes.
You can run the following command to get serialVersionUID

serialver [-classpath classpath] [-show] [classname…]

Источник

Оцените статью