Java extensión de la serialización de la clase

Wouter Vanden Putte:

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 Personen 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

m.antkowicz:

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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=234003&siteId=1
Recomendado
Clasificación