¿Formas de serializar una clase con el campo Objeto?

He estado usando una clase:

public class Change {
    Object affectedObj;  //takes an instance of any class
    String affectedFieldName;
    float shift;
    ...

    public void apply() {
        affectedObj.getClass().getField(affectedFieldName).setFloat(affectedObj, shift);
    }
}

que ahora necesito serializar. Como Objectno es serializable, ¿cómo puedo hacer que mi clase sea serializable?

Una cosa que me vino a la mente es reemplazar Objectcon un <T>tipo genérico :

public class Change<T> {
    T affectedObj;  //takes an instance of any class
    String affectedFieldName;
    float shift;
    ...

    public void apply() {
        affectedObj.getClass().getField(affectedFieldName).setFloat(affectedObj, shift);
    }
}

Pero no puedo juzgar las desventajas de este enfoque. Si es un buen camino a seguir, ¿cuáles son los escollos aquí con respecto a la serialización?

PD

Gracias chicos por su respuesta. Todos fueron reveladores y útiles para mí.

Respuesta 1

No hay necesariamente ningún problema. Objectno lo es Serializable, pero tampoco lo es Serializable . Todavía puede serializar una clase que declara Objectcampos, siempre que en el momento de la serialización los campos sean nulos o apunten a instancias de Serializableobjetos. (De lo contrario, la serialización fallará con a NotSerializableException.)

Si realmente necesita affectedObjser "cualquier clase", bueno, entonces tiene un problema, porque hay algunas cosas que no se pueden serializar sin importar cuánto lo intente (abrir conexiones de red, por ejemplo).

Si desea restringir affectedObja Serializableobjetos, simplemente declare el campo como tipo Serializable:

public class Change implements Serializable {
    Serializable affectedObj; // takes an instance of any Serializable class
    ...
}

No es necesario usar genéricos para esto. Todavía puede usar los genéricos si lo desea por otros motivos, por ejemplo, si desea que los usuarios de la clase puedan establecer y obtener ese campo de una manera totalmente tipada. Sin embargo, no afecta la serialización.

Respuesta: 2

Hacer que su clase sea genérica no lo ayudará a menos que restrinja T para que sea serializable agregando Change<T extends Serializable>, sin embargo, restringirá los tipos que su clase puede aceptar.

Otra opción es implementar Externalizable, pero luego deberá implementar tanto read () como write () y tendrá que serializar un objeto desconocido de todos modos.

¿Hay alguna razón para no usar un formato no específico de Java como json, thrift, msgpack u otro?

Respuesta: 3

Estoy tratando de agregar una cuenta de proveedor de sincronización y todo iba bien hasta que hago clic en la cuenta dentro de la configuración de la cuenta. Recibo el siguiente error a continuación en LogCat. Como puedes ver es ...

Tengo este código y me gustaría que sea una aplicación multilingüe. Lo que quiero es usar las cadenas del archivo Strings.xml en el directorio de valores. Digamos que tengo una tostada ... Toast.makeText (...

Un script JEXL no es lo mismo que una expresión JEXL. Veo referencias a funciones en el código fuente, pero no veo documentación al respecto. ¿Tal vez aún no se ha implementado? Hay un JSR-223 ...

Tengo la siguiente matriz de expresiones regulares: String [] array = new String [] {"(car) | (truck) | (bus) | (van)", // 4) transportes "(w) | (x) | (y) | (z) ", // 1) opciones" 1 | 2 | 3 | 4 ", // 2) números ...