ISerializable Interfaz
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
La serialización de una clase está habilitada por la clase que implementa 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
- Derivado
- Atributos
- Implementaciones
Comentarios
La serialización de una clase está habilitada por la clase que implementa la interfaz java.io.Serializable.
<advertencia fuerte>: la deserialización de datos que no son de confianza es intrínsecamente peligrosa y debe evitarse. Los datos que no son de confianza deben validarse cuidadosamente. </strong>
Las clases que no implementan esta interfaz no tendrán ninguno de sus estados serializados o deserializados. Todos los subtipos de una clase serializable se serializables. La interfaz de serialización no tiene métodos ni campos y solo sirve para identificar la semántica de ser serializable.
Para permitir que los subtipos de clases no serializables se serialicen, el subtipo puede asumir la responsabilidad de guardar y restaurar el estado de los campos de paquete públicos, protegidos y (si son accesibles) del supertipo. El subtipo puede asumir esta responsabilidad solo si la clase que extiende tiene un constructor sin arg accesible para inicializar el estado de la clase. Es un error declarar una clase Serializable si no es así. El error se detectará en tiempo de ejecución.
Durante la deserialización, los campos de clases no serializables se inicializarán mediante el constructor no arg público o protegido de la clase . Un constructor no-arg debe ser accesible para la subclase que es serializable. Los campos de las subclases serializables se restaurarán a partir de la secuencia.
Al recorrer un grafo, es posible que se encuentre un objeto que no admita la interfaz Serializable. En este caso, se iniciará notSerializableException e identificará la clase del objeto no serializable.
Las clases que requieren un control especial durante el proceso de serialización y deserialización deben implementar métodos especiales con estas firmas exactas:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
El método writeObject es responsable de escribir el estado del objeto para su clase determinada para que el método readObject correspondiente pueda restaurarlo. El mecanismo predeterminado para guardar los campos del objeto se puede invocar llamando a out.defaultWriteObject. El método no necesita preocuparse por el estado que pertenece a sus superclases o subclases. El estado se guarda escribiendo los campos individuales en ObjectOutputStream mediante el método writeObject o mediante los métodos para los tipos de datos primitivos admitidos por DataOutput.
El método readObject es responsable de leer desde la secuencia y restaurar los campos de clases. Puede llamar a in.defaultReadObject para invocar el mecanismo predeterminado para restaurar los campos no estáticos y no transitorios del objeto. El método defaultReadObject usa información en la secuencia para asignar los campos del objeto guardado en la secuencia con los campos con nombre correspondiente en el objeto actual. Esto controla el caso cuando la clase ha evolucionado para agregar nuevos campos. El método no necesita preocuparse por el estado que pertenece a sus superclases o subclases. El estado se restaura leyendo datos de ObjectInputStream para los campos individuales y realizando asignaciones a los campos adecuados del objeto. DataInput admite la lectura de tipos de datos primitivos.
El método readObjectNoData es responsable de inicializar el estado del objeto para su clase determinada en caso de que el flujo de serialización no muestre la clase especificada como superclase del objeto que se deserializa. Esto puede ocurrir en casos en los que la entidad receptora usa una versión diferente de la clase de la instancia deserializada que la entidad de envío y la versión del receptor extiende las clases que no se extienden por la versión del remitente. Esto también puede ocurrir si se ha alterado la secuencia de serialización; Por lo tanto, readObjectNoData es útil para inicializar objetos deserializados correctamente a pesar de una secuencia de origen "hostil" o incompleta.
Las clases serializables que necesitan designar un objeto alternativo que se va a usar al escribir un objeto en la secuencia deben implementar este método especial con la firma exacta:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
La serialización invoca este método writeReplace si el método existe y sería accesible desde un método definido dentro de la clase del objeto que se va a serializar. Por lo tanto, el método puede tener acceso privado, protegido y privado del paquete. El acceso de subclase a este método sigue las reglas de accesibilidad de Java.
Las clases que necesitan designar un reemplazo cuando se lee una instancia de la secuencia deben implementar este método especial con la firma exacta.
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
Este método readResolve sigue las mismas reglas de invocación y reglas de accesibilidad que writeReplace.
El tiempo de ejecución de serialización asocia a cada clase serializable un número de versión, denominado serialVersionUID, que se usa durante la deserialización para comprobar que el remitente y el receptor de un objeto serializado tienen clases cargadas para ese objeto que son compatibles con la serialización. Si el receptor ha cargado una clase para el objeto que tiene un valor serialVersionUID diferente al de la clase del remitente correspondiente, la deserialización producirá una InvalidClassException
excepción . Una clase serializable puede declarar explícitamente su propia serialVersionUID declarando un campo denominado "serialVersionUID"
que debe ser estático, final y de tipo long
:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
Si una clase serializable no declara explícitamente un serialVersionUID, el runtime de serialización calculará un valor serialVersionUID predeterminado para esa clase en función de varios aspectos de la clase, como se describe en la Especificación de serialización de objetos java(TM). Sin embargo, se <>recomienda< encarecidamente/em> que todas las clases serializables declaren explícitamente valores serialVersionUID, ya que el cálculo serialVersionUID predeterminado es altamente sensible a los detalles de clase que pueden variar en función de las implementaciones del compilador y, por lo tanto, puede dar lugar a errores inesperados InvalidClassException
durante la deserialización. Por lo tanto, para garantizar un valor serialVersionUID coherente en diferentes implementaciones del compilador java, una clase serializable debe declarar un valor serialVersionUID explícito. También se recomienda encarecidamente que las declaraciones serialVersionUID explícitas usen el private
modificador siempre que sea posible, ya que estas declaraciones solo se aplican a la declaración inmediata de campos class--serialVersionUID no son útiles como miembros heredados. Las clases de matriz no pueden declarar un serialVersionUID explícito, por lo que siempre tienen el valor calculado predeterminado, pero el requisito de buscar valores serialVersionUID coincidentes se renuncia a las clases de matriz.
La implementación de Android del cálculo serialVersionUID cambiará ligeramente para algunas clases si tiene como destino android N. Para conservar la compatibilidad, este cambio solo está habilitado es que la versión del SDK de destino de la aplicación esté establecida en 24 o superior. Se recomienda encarecidamente usar un campo serialVersionUID explícito para evitar problemas de compatibilidad.
<h3>Implementar serializable judiciously</h3> Consulte el capítulo de Java efectivo sobre la serialización para una cobertura exhaustiva de la API de serialización. En el libro se explica cómo usar esta interfaz sin dañar la capacidad de mantenimiento de la aplicación.
<h3>Alternativas recomendadas</h3><>fuerte JSON</strong> es concisa, legible y eficiente. Android incluye y android.util.JsonReader streaming API
para org.json.JSONObject tree API
leer y escribir JSON. Use una biblioteca de enlaces como GSON para leer y escribir objetos de Java directamente.
Agregado en la versión 1.1.
Documentación de Java para java.io.Serializable
.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.
Propiedades
Handle |
Obtiene el valor JNI del objeto Android subyacente. (Heredado de IJavaObject) |
JniIdentityHashCode |
Devuelve el valor de |
JniManagedPeerState |
Estado del mismo nivel administrado. (Heredado de IJavaPeerable) |
JniPeerMembers |
Compatibilidad con la invocación y el acceso de miembros. (Heredado de IJavaPeerable) |
PeerReference |
Devuelve una JniObjectReference de la instancia de objeto Java ajustada. (Heredado de IJavaPeerable) |
Métodos
Disposed() |
Se llama cuando se ha eliminado la instancia. (Heredado de IJavaPeerable) |
DisposeUnlessReferenced() |
Si no hay referencias pendientes a esta instancia, llama a |
Finalized() |
Se llama cuando se ha finalizado la instancia. (Heredado de IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
Establezca el valor devuelto por |
SetJniManagedPeerState(JniManagedPeerStates) |
La serialización de una clase está habilitada por la clase que implementa java. (Heredado de IJavaPeerable) |
SetPeerReference(JniObjectReference) |
Establezca el valor devuelto por |
UnregisterFromRuntime() |
Anule el registro de esta instancia para que el entorno de ejecución no lo devuelva de invocaciones futuras Java.Interop.JniRuntime+JniValueManager.PeekValue . (Heredado de IJavaPeerable) |
Métodos de extensión
JavaCast<TResult>(IJavaObject) |
Realiza una conversión de tipos comprobados en tiempo de ejecución de Android. |
JavaCast<TResult>(IJavaObject) |
La serialización de una clase está habilitada por la clase que implementa java. |
GetJniTypeName(IJavaPeerable) |
La serialización de una clase está habilitada por la clase que implementa java. |