ISerializable Interfaccia
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
La serializzabilità di una classe è abilitata dalla classe che 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
- Derivato
- Attributi
- Implementazioni
Commenti
La serializzabilità di una classe è abilitata dalla classe che implementa l'interfaccia java.io.Serializable.
<avviso sicuro>: la deserializzazione di dati non attendibili è intrinsecamente pericolosa e deve essere evitata. I dati non attendibili devono essere convalidati con attenzione. </assoluta>
Le classi che non implementano questa interfaccia non avranno alcuno stato serializzato o deserializzato. Tutti i sottotipi di una classe serializzabile sono serializzabili. L'interfaccia di serializzazione non dispone di metodi o campi e serve solo per identificare la semantica di essere serializzabile.
Per consentire la serializzazione di sottotipi di classi non serializzabili, il sottotipo può assumere la responsabilità di salvare e ripristinare lo stato dei campi del pacchetto pubblico, protetto e (se accessibile) del supertipo. Il sottotipo può assumere questa responsabilità solo se la classe estesa ha un costruttore no-arg accessibile per inizializzare lo stato della classe. È un errore dichiarare una classe Serializable se questo non è il caso. L'errore verrà rilevato in fase di esecuzione.
Durante la deserializzazione, i campi delle classi non serializzabili verranno inizializzati usando il costruttore no-arg pubblico o protetto della classe . Un costruttore no-arg deve essere accessibile alla sottoclasse serializzabile. I campi delle sottoclassi serializzabili verranno ripristinati dal flusso.
Quando si attraversa un grafico, è possibile che venga rilevato un oggetto che non supporta l'interfaccia serializzabile. In questo caso, l'eccezione NotSerializableException verrà generata e identificherà la classe dell'oggetto non serializzabile.
Le classi che richiedono una gestione speciale durante il processo di serializzazione e deserializzazione devono implementare metodi speciali con queste firme esatte:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
Il metodo writeObject è responsabile della scrittura dello stato dell'oggetto per la classe specifica in modo che il metodo readObject corrispondente possa ripristinarlo. Il meccanismo predefinito per salvare i campi dell'oggetto può essere richiamato chiamando out.defaultWriteObject. Il metodo non deve preoccuparsi dello stato appartenente alle sottoclassi o alle sottoclassi. Lo stato viene salvato scrivendo i singoli campi in ObjectOutputStream usando il metodo writeObject o utilizzando i metodi per i tipi di dati primitivi supportati da DataOutput.
Il metodo readObject è responsabile della lettura dal flusso e del ripristino dei campi delle classi. Può chiamare in.defaultReadObject per richiamare il meccanismo predefinito per ripristinare i campi non statici e non temporanei dell'oggetto. Il metodo defaultReadObject usa le informazioni nel flusso per assegnare i campi dell'oggetto salvato nel flusso con i campi denominati in modo corrispondente nell'oggetto corrente. In questo modo viene gestito il caso in cui la classe si è evoluta per aggiungere nuovi campi. Il metodo non deve preoccuparsi dello stato appartenente alle sottoclassi o alle sottoclassi. Lo stato viene ripristinato leggendo i dati da ObjectInputStream per i singoli campi ed eseguendo assegnazioni ai campi appropriati dell'oggetto. La lettura dei tipi di dati primitivi è supportata da DataInput.
Il metodo readObjectNoData è responsabile dell'inizializzazione dello stato dell'oggetto per la classe specifica nel caso in cui il flusso di serializzazione non elenca la classe specificata come superclasse dell'oggetto da deserializzare. Ciò può verificarsi nei casi in cui la parte ricevente usa una versione diversa della classe dell'istanza deserializzata rispetto all'entità di invio e la versione del ricevitore estende le classi non estese dalla versione del mittente. Ciò può verificarsi anche se il flusso di serializzazione è stato manomesso; pertanto, readObjectNoData è utile per inizializzare correttamente gli oggetti deserializzati nonostante un flusso di origine "ostile" o incompleto.
Le classi serializzabili che devono designare un oggetto alternativo da usare durante la scrittura di un oggetto nel flusso devono implementare questo metodo speciale con la firma esatta:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
Questo metodo writeReplace viene richiamato dalla serializzazione se il metodo esiste ed è accessibile da un metodo definito all'interno della classe dell'oggetto da serializzare. Di conseguenza, il metodo può avere accesso privato, protetto e privato del pacchetto. L'accesso alla sottoclasse a questo metodo segue le regole di accessibilità Java.
Le classi che devono designare una sostituzione quando un'istanza di viene letta dal flusso deve implementare questo metodo speciale con la firma esatta.
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
Questo metodo readResolve segue le stesse regole di chiamata e regole di accessibilità di writeReplace.
Il runtime di serializzazione viene associato a ogni classe serializzabile un numero di versione, denominato serialVersionUID, che viene usato durante la deserializzazione per verificare che il mittente e il ricevitore di un oggetto serializzato abbiano caricato classi per tale oggetto compatibili rispetto alla serializzazione. Se il ricevitore ha caricato una classe per l'oggetto con un serialVersionUID diverso da quello della classe del mittente corrispondente, la deserializzazione genererà un oggetto InvalidClassException
. Una classe serializzabile può dichiarare il proprio serialVersionUID in modo esplicito dichiarando un campo denominato "serialVersionUID"
che deve essere statico, finale e di tipo long
:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
Se una classe serializzabile non dichiara in modo esplicito un serialVersionUID, il runtime di serializzazione calcolerà un valore serialVersionUID predefinito per tale classe in base a vari aspetti della classe, come descritto nella specifica di serializzazione degli oggetti Java(TM). Tuttavia, è <>fortemente consigliato</em> che tutte le classi serializzabili dichiarano in modo esplicito i valori serialVersionUID, poiché il calcolo serialVersionUID predefinito è altamente sensibile ai dettagli della classe che possono variare a seconda delle implementazioni del compilatore e pertanto può comportare s imprevisti InvalidClassException
durante la deserializzazione. Pertanto, per garantire un valore serialVersionUID coerente in diverse implementazioni del compilatore Java, una classe serializzabile deve dichiarare un valore serialVersionUID esplicito. È inoltre consigliabile che le dichiarazioni serialVersionUID esplicite usino il private
modificatore laddove possibile, poiché tali dichiarazioni si applicano solo ai campi immediatamente dichiaranti di classe-serialVersionUID non sono utili come membri ereditati. Le classi di matrice non possono dichiarare un serialVersionUID esplicito, quindi hanno sempre il valore calcolato predefinito, ma il requisito per la corrispondenza dei valori serialVersionUID viene rinunciato per le classi di matrice.
L'implementazione android del calcolo serialVersionUID cambierà leggermente per alcune classi se la destinazione è Android N. Per mantenere la compatibilità, questa modifica è abilitata solo se la versione dell'SDK di destinazione dell'applicazione è impostata su 24 o versione successiva. È consigliabile usare un campo serialVersionUID esplicito per evitare problemi di compatibilità.
<h3>Implementare Serializzabile Judiciously</h3> Fare riferimento al capitolo di Effective Java sulla serializzazione per una copertura completa dell'API di serializzazione. Il libro spiega come usare questa interfaccia senza danneggiare la manutenibilità dell'applicazione.
<h3>Alternative consigliate</h3><strong>JSON</strong> è conciso, leggibile ed efficiente. Android include sia un oggetto android.util.JsonReader streaming API
che un org.json.JSONObject tree API
oggetto per leggere e scrivere JSON. Usare una libreria di binding come GSON per leggere e scrivere direttamente oggetti Java.
Aggiunta nella versione 1.1.
Documentazione java per java.io.Serializable
.
Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.
Proprietà
Handle |
Ottiene il valore JNI dell'oggetto Android sottostante. (Ereditato da IJavaObject) |
JniIdentityHashCode |
Restituisce il valore di |
JniManagedPeerState |
Stato del peer gestito. (Ereditato da IJavaPeerable) |
JniPeerMembers |
Supporto per l'accesso ai membri e la chiamata. (Ereditato da IJavaPeerable) |
PeerReference |
Restituisce un JniObjectReference oggetto dell'istanza dell'oggetto Java di cui è stato eseguito il wrapping. (Ereditato da IJavaPeerable) |
Metodi
Disposed() |
Chiamato quando l'istanza è stata eliminata. (Ereditato da IJavaPeerable) |
DisposeUnlessReferenced() |
Se non sono presenti riferimenti in sospeso a questa istanza, chiama |
Finalized() |
Chiamato quando l'istanza è stata finalizzata. (Ereditato da IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
Impostare il valore restituito da |
SetJniManagedPeerState(JniManagedPeerStates) |
La serializzabilità di una classe è abilitata dalla classe che implementa java. (Ereditato da IJavaPeerable) |
SetPeerReference(JniObjectReference) |
Impostare il valore restituito da |
UnregisterFromRuntime() |
Annullare la registrazione di questa istanza in modo che il runtime non lo restituisca dalle chiamate future Java.Interop.JniRuntime+JniValueManager.PeekValue . (Ereditato da IJavaPeerable) |
Metodi di estensione
JavaCast<TResult>(IJavaObject) |
Esegue una conversione del tipo di tipo controllato dal runtime Android. |
JavaCast<TResult>(IJavaObject) |
La serializzabilità di una classe è abilitata dalla classe che implementa java. |
GetJniTypeName(IJavaPeerable) |
La serializzabilità di una classe è abilitata dalla classe che implementa java. |