¿Por qué veo que los valores de campo de las constantes Enum se serializan / deserializan? ¿En qué escenario y qué no se serializa exactamente en enumeraciones?

La especificación de serialización (SE8) implica que los valores de campo de las constantes enum no están serializados (como lo leí):

1.12 Serialización de constantes Enum Las constantes Enum se serializan de manera diferente a los objetos serializables o externalizables ordinarios. La forma serializada de una constante enum consiste únicamente en su nombre; Los valores de campo de la constante no están presentes en el formulario .

Pero veo que se serializan / deserializan.

En el siguiente código, el campo public int x = 1234;de la constante enum INSTANCEse serializa / deserializa en dos escenarios:

  1. Al establecerse solo en el constructor (después public int x = 1234;, el setX()método nunca se llamó), x = 1234se deserializa con éxito.
  2. Después del constructor, llamosetX(7) , pero ese valor establecido ( x=7) se deserializa con éxito.

Entonces, ¿ qué es exactamente y en qué escenario no se serializa / deserializa en enum? ¿Y qué significa el término "forma" (de la cita anterior)?

enum MyEnum1 {

INSTANCE {
    public int x = 1234;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }
};

public abstract int getX();

public abstract void setX(int x);

}

public class AAA {

    public static void main(String[] args) {


        MyEnum1 obj = MyEnum1.INSTANCE; 
        obj.setX(7);
        System.out.println(obj.getX());
        String fileName = "d:\\del.me";
        int bufSz = 8 * 1024;

        try {
            ObjectOutputStream oos = new ObjectOutputStream(
                    new BufferedOutputStream(new FileOutputStream(fileName), bufSz));
            oos.writeObject(obj);
            oos.flush();
        } catch (IOException e) {   }


        MyEnum1 obj1 = null;
        MyEnum1 obj2 = null;
        try {
            ObjectInputStream ois = new ObjectInputStream(
                    new BufferedInputStream(new FileInputStream(fileName), bufSz));

            ObjectInputStream ois1 = new ObjectInputStream(
                    new BufferedInputStream(new FileInputStream(fileName), bufSz));

            obj1 = (MyEnum1) ois.readObject();
            obj2 = (MyEnum1) ois1.readObject();
        } catch (IOException | ClassNotFoundException e) {  }

        // x is restored, either the one set by setX()
        // or the one just set in inline constructor (initializer) without calling setX() 
        System.out.println(obj1.getX());  // 1234 without setX(7), 7 with setX(7)
        System.out.println(obj2.getX());  // 1234 without setX(7), 7 with setX(7)

    }

}

PD Esta respuesta también me implica que los campos dentro de las constantes enum no se serializan:

A mi entender, no tiene sentido marcar los valores de campo de Enum como transitorios o hacer que implementen Serializable, ya que nunca se serializarán , sin importar si están marcados como transitorios o implementan Serializable.

Pero todos los campos (no transitorios) (al menos los primitivos) dentro de la constante enum (como Color { RED { fields }; }) o dentro de la enumeración pero "fuera" de cada constante separada ( Color { RED { fields }; fields_for_all_constants}) se serializan , como yo lo veo.

Respuesta 1

Estoy recuperando datos de un archivo y por alguna razón extraño el primer carácter cada vez. mi código. public String readFile () {String str = "No autenticado"; // Leyendo el archivo intente {...

Quiero convertir cualquier archivo a PNG y también revertir el proceso, todo en Java. Quiero usar un formulario int-RGB para la imagen, y hacer que los bytes del archivo sean un byte en el entero RGB. Esta ...

Estoy tratando de acceder a un archivo de Microsoft Excel a través de Java utilizando sun.jdbc.odbc.JdbcOdbcDriver. Sin embargo, sigo obteniendo: "java.sql.SQLException: [Microsoft] [ODBC Driver Manager] Nombre del origen de datos no ...

Este es un buen comienzo. Tengo una situación en la que necesito reiniciar la aplicación después de borrar las preferencias compartidas, así que esto es lo que hago sp.edit (). Clear (). Apply (); Intención mStartActivity = new ...