Поделиться через


ISerializable Интерфейс

Определение

Сериализуемость класса включена классом, реализующим java.

[Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")]
public interface ISerializable : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")>]
type ISerializable = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Производный
Атрибуты
Реализации

Комментарии

Сериализуемость класса включена классом, реализующим интерфейс java.io.Serializable.

<строгое>предупреждение. Десериализация ненадежных данных по сути является опасной и должна быть избегаема. Ненадежные данные должны быть тщательно проверены. </strong>

Классы, не реализующие этот интерфейс, не будут иметь сериализованные или десериализованные состояния. Все подтипы сериализуемого класса являются сериализуемыми. Интерфейс сериализации не имеет методов или полей и служит только для идентификации семантики сериализации сериализации.

Чтобы разрешить сериализацию подтипов несериализированных классов, подтип может взять на себя ответственность за сохранение и восстановление состояния общедоступных, защищенных и доступных полей пакета супертипа. Подтип может взять на себя эту ответственность только в том случае, если класс, который он расширяет, имеет доступный конструктор no-arg для инициализации состояния класса. Это ошибка объявления класса Serializable, если это не так. Ошибка будет обнаружена во время выполнения.

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

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

Классы, требующие специальной обработки во время процесса сериализации и десериализации, должны реализовывать специальные методы с этими точными сигнатурами:

private void writeObject(java.io.ObjectOutputStream out)
                throws IOException
            private void readObject(java.io.ObjectInputStream in)
                throws IOException, ClassNotFoundException;
            private void readObjectNoData()
                throws ObjectStreamException;

Метод writeObject отвечает за запись состояния объекта для определенного класса, чтобы соответствующий метод readObject смог восстановить его. Механизм по умолчанию для сохранения полей объекта можно вызвать путем вызова out.defaultWriteObject. Метод не должен беспокоиться о состоянии, относящемся к его суперклассам или подклассам. Состояние сохраняется путем записи отдельных полей в ObjectOutputStream с помощью метода writeObject или с помощью методов для примитивных типов данных, поддерживаемых DataOutput.

Метод readObject отвечает за чтение из потока и восстановление полей классов. Он может вызвать in.defaultReadObject, чтобы вызвать механизм по умолчанию для восстановления нестатических и временных полей объекта. Метод defaultReadObject использует сведения в потоке для назначения полей объекта, сохраненного в потоке, с соответствующими именованными полями в текущем объекте. Это обрабатывает ситуацию, когда класс развивался для добавления новых полей. Метод не должен беспокоиться о состоянии, относящемся к его суперклассам или подклассам. Состояние восстанавливается путем чтения данных из ObjectInputStream для отдельных полей и назначения для соответствующих полей объекта. Чтение примитивных типов данных поддерживается DataInput.

Метод readObjectNoData отвечает за инициализацию состояния объекта для определенного класса в том случае, если поток сериализации не перечисляет заданный класс в качестве суперкласса десериализуемого объекта. Это может произойти в случаях, когда получатель использует другую версию класса десериализированного экземпляра, чем отправляющая сторона, а версия получателя расширяет классы, которые не расширяются версией отправителя. Это также может произойти, если поток сериализации был изменен; следовательно, readObjectNoData полезно для инициализации десериализированных объектов должным образом, несмотря на "враждебный" или неполный исходный поток.

Сериализуемые классы, которым необходимо назначить альтернативный объект, который следует использовать при записи объекта в поток, должен реализовать этот специальный метод с точной подписью:

ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;

Этот метод writeReplace вызывается сериализацией, если этот метод существует, и он будет доступен из метода, определенного в классе сериализованного объекта. Таким образом, метод может иметь частный, защищенный и закрытый доступ к пакету. Доступ подкласса к этому методу следует правилам специальных возможностей Java.

Классы, которые должны назначить замену при чтении экземпляра из потока, должны реализовать этот специальный метод с точной подписью.

ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;

Этот метод readResolve следует тем же правилам вызова и правилам специальных возможностей, что и writeReplace.

Среда выполнения сериализации связывается с каждым сериализуемым классом номер версии, который называется serialVersionUID, который используется во время десериализации, чтобы убедиться, что отправитель и получатель сериализованного объекта загружают классы для этого объекта, совместимого с сериализацией. Если получатель загрузил класс для объекта, имеющего другой serialVersionUID, отличный от класса соответствующего отправителя, десериализация приведет к InvalidClassExceptionвозникновению. Сериализуемый класс может объявлять собственный serialVersionUID явным образом, объявляя поле с именем "serialVersionUID" , которое должно быть статическим, окончательным и типом long:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

Если сериализуемый класс явно не объявляет serialVersionUID, среда выполнения сериализации вычисляет значение serialVersionUID по умолчанию для этого класса на основе различных аспектов класса, как описано в спецификации сериализации объектов Java(TM). Однако настоятельно рекомендуется <><и em>, чтобы все сериализуемые классы явно объявляли значения serialVersionUID, так как вычисления serialVersionUID по умолчанию очень чувствительны к сведениям о классах, которые могут отличаться в зависимости от реализаций компилятора, и таким образом может привести к непредвиденным InvalidClassExceptionзначениям во время десериализации. Таким образом, чтобы гарантировать согласованное значение serialVersionUID в разных реализациях компилятора java, сериализуемый класс должен объявить явное значение serialVersionUID. Кроме того, настоятельно рекомендуется, чтобы явные объявления serialVersionUID использовали private модификатор, если это возможно, так как такие объявления применяются только к полям класса-serialVersionUID, не являются полезными как унаследованные элементы. Классы массива не могут объявлять явный serialVersionUID, поэтому они всегда имеют вычисляемое значение по умолчанию, но требование для сопоставления значений serialVersionUID отменяется для классов массивов.

Реализация android serialVersionUID вычислений будет немного меняться для некоторых классов, если вы нацелены на Android N. Чтобы сохранить совместимость, это изменение включено только в том случае, если для целевого пакета SDK для приложения задано значение 24 или более поздней версии. Настоятельно рекомендуется использовать явное поле serialVersionUID, чтобы избежать проблем совместимости.

<h3>Реализация сериализуемой рассудительности</h3> см. в разделе "Эффективная версия Java" по сериализации для тщательного охвата API сериализации. В книге объясняется, как использовать этот интерфейс без ущерба для обслуживания приложения.

<h3 Рекомендуемые альтернативные варианты/h3>><сильный>JSON</strong> — это краткий, читаемый человеком и эффективный.< Android включает как a, android.util.JsonReader streaming API так и a org.json.JSONObject tree API для чтения и записи JSON. Используйте библиотеку привязки, например GSON , для чтения и записи объектов Java напрямую.

Добавлено в версии 1.1.

Документация по Java для java.io.Serializable.

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Свойства

Handle

Возвращает значение JNI базового объекта Android.

(Унаследовано от IJavaObject)
JniIdentityHashCode

Возвращает значение java.lang.System.identityHashCode() для упаковаемого экземпляра.

(Унаследовано от IJavaPeerable)
JniManagedPeerState

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

(Унаследовано от IJavaPeerable)
JniPeerMembers

Поддержка доступа к членам и вызовов.

(Унаследовано от IJavaPeerable)
PeerReference

JniObjectReference Возвращает экземпляр объекта Java в оболочке.

(Унаследовано от IJavaPeerable)

Методы

Disposed()

Вызывается при удалении экземпляра.

(Унаследовано от IJavaPeerable)
DisposeUnlessReferenced()

Если нет невыполненных ссылок на этот экземпляр, то вызывается Dispose(); в противном случае ничего не делает.

(Унаследовано от IJavaPeerable)
Finalized()

Вызывается при завершении экземпляра.

(Унаследовано от IJavaPeerable)
SetJniIdentityHashCode(Int32)

Задайте значение, возвращаемое JniIdentityHashCode.

(Унаследовано от IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Сериализуемость класса включена классом, реализующим java.

(Унаследовано от IJavaPeerable)
SetPeerReference(JniObjectReference)

Задайте значение, возвращаемое PeerReference.

(Унаследовано от IJavaPeerable)
UnregisterFromRuntime()

Отмените регистрацию этого экземпляра, чтобы среда выполнения не возвращала ее из будущих Java.Interop.JniRuntime+JniValueManager.PeekValue вызовов.

(Унаследовано от IJavaPeerable)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверяемого средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Сериализуемость класса включена классом, реализующим java.

GetJniTypeName(IJavaPeerable)

Сериализуемость класса включена классом, реализующим java.

Применяется к