Supongamos que tengo una clase Article
public class Article implements Serializable
{
private static final long serialVersionUID = 1420672609912364060L;
private String title;
private String text;
private UUID uid;
public Article(){ //empty default constructor
}
// Getters and setters
...
}
y I serializar múltiples instancias de la misma utilizando el código siguiente
public void save(Article article)
{
FileOutputStream fos = null;
try {
fos = context.openFileOutput("article_"+ article.getUid(), Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(article);
os.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Yo luego extender la toma de la clase que se vea como esto:
public class Article implements Serializable
{
private static final long serialVersionUID = 1420672609912364060L;
private String title;
private String text;
private Person author;
private UUID uid;
public Article(){
author = Person.UNKNOWN;
}
// Getters and setters
...
}
Luego, cuando lo cargo en, por eso es nula autor? Siempre pensé que el constructor por defecto se llama y luego el setter para cada propiedad que se encuentre, pero poner un punto de interrupción en el constructor por defecto y luego depurar programas no se llama. Lo que significa que para la antigua clase de artículo, el autor simplemente sería nulo en lugar de Person.UNKNOWN. La clase Person
en sí también es serializable.
Este es mi código de carga en si podría ser relevante.
private Article loadArticle(String fileName)
{
FileInputStream fis = null;
try {
fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
Article article = (Article ) is.readObject();
is.close();
fis.close();
return article;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (InvalidClassException e) {
}
catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
Tenga en cuenta que es toda la configuración de Android
Siempre pensé que el constructor por defecto se llama
Nop no lo era. Echar un vistazo a la documentación
Durante la deserialización, los campos de clases no serializables serán inicializadas con el público o protegidos constructor sin argumentos de la clase. Un constructor sin argumentos debe ser accesible a la subclase que es serializable. Los campos de subclases serializables serán restauradas de la corriente.