Establecer el valor predeterminado para los campos que no están en XML en XStream

¿Hay alguna forma de crear un convertidor o alguna operación que se realice después de cada conversión? Para el contexto, estoy tratando de completar los valores predeterminados para los campos que no están en mi XML para mantener la compatibilidad con versiones anteriores si cambia mi modelo de datos. Por ejemplo, si tuviera este objeto:

class A {
    private String b;
    private String c;
    private String d;
}

y mi XML era algo así como:

<a>
 <b>b</b>
 <d>d</d>
</a>

Quiero que mi importación del XML sepa que hay un valor predeterminado para el campo cque es "c"y lo configuro Acomo tal. Esta debería ser una operación genérica a la que puedo agregar valores predeterminados en cualquier campo de un gráfico muy complejo. Si hubiera alguna forma de activar una función después de cada conversión, podría verificar el objeto actual contra un mapa de objetos en los que me gustaría establecer un valor predeterminado.

También tenga en cuenta que el uso de readResolve / readObject no parece ser una opción ya que 1. readObject () nunca pareció funcionar para mí en absoluto y 2. readResolve sobrescribiría el campo con el valor predeterminado, incluso si realmente se incluyera en el XML . Por favor, avíseme si mis suposiciones aquí son incorrectas.

Editar :: Encontré este hilo relacionado en la lista de correo del usuario: http://article.gmane.org/gmane.comp.java.xstream.user/4619/match=default+value

y parece que la única solución sugerida es usar readResolve()lo que ya dije que no era una solución válida.

Respuesta 1

Utilice el proveedor PureJavaReflectionProvider

XStream xstream = new XStream(new PureJavaReflectionProvider());

e inicialice su objeto con los valores predeterminados como de costumbre. Ya sea a través de la inicialización de campo o el código del constructor (inicializador).

antecedentes

Si no especifica un ReflectionProviderxstream, intenta encontrar el mejor proveedor de reflexión. Pero lo mejor ReflectionProviderpara xstream podría no ser lo mejor para usted, porque generalmente selecciona el Sun14ReflectionProvider.

El Sun14ReflectionProviderutiliza la misma estrategia de instancias como el mecanismo java serialización y eso significa que se salta código constructor o para ser más precisos - el objeto inicializador código.

Por lo tanto, las inicializaciones de campo de instancia como

class A {
    private String b = "DEFAULT";
}

NO se aplicará y tampoco se aplicará el código de constructor, por ejemplo

class A {
    private String b;

    public A(){
        b = "DEFAULT";
    }
}

En su PureJavaReflectionProviderlugar, utiliza (como su nombre lo indica) la API de reflexión de Java para instanciar objetos, por ejemplo, Class.newInstance()y , por lo tanto, se ejecuta el código de inicialización del objeto.

Respuesta: 2

El objeto clave en WeakHashMap se volvió débilmente accesible. Y el mapa debe eliminar la entrada después de GC. Pero queda una fuerte referencia al objeto de valor. ¿Por qué? El mismo comportamiento se observa con la guayaba ...

Vi este código en el sitio web del centro de capacitación de Android: boolean hasExternalStoragePrivateFile () {// Obtener la ruta del archivo en el almacenamiento externo. Si el almacenamiento externo // no está montado actualmente ...

Estoy creando archivos zip en GAE con Java, usando ZipOutputStream para subirlos a Google Cloud Storage. Sin embargo, necesito encriptar los archivos pero no sé cómo. ¿Alguien sabe cómo cifrar un ...

Tal vez esta es una pregunta para novatos, pero no puedo encontrar la respuesta. Necesito tropezar un método con Mockito. Si el método tiene argumentos "simples", entonces puedo hacerlo. Por ejemplo, un método de búsqueda con dos ...