XMLEncoder se puede usar para cualquier clase, incluidas las definidas por el usuario; el artículo que menciona detalla cómo hacerlo, pero no está muy bien escrito, por lo que puede ser un poco difícil de entender.
Si la clase definida por el usuario sigue el JavaBeans spec, a continuación, puedes utilizar encoder.writeObject()
para serializar una instancia List<Foo>
. Esto se debe a que la salida XML es solo una serie de instrucciones sobre cómo recrear la instancia determinada en tiempo de ejecución. El predeterminado PersistenceDelegate sabe cómo serializar una estructura de lista, pero solo tiene un comportamiento predeterminado para las clases desconocidas. Por defecto, intenta recrear una instancia de objeto dada llamando a su constructor nullary (sin argumento) y luego configurando sus propiedades una por una a los valores de la instancia dada, algo que se garantiza que será posible si la clase es JavaBean.
Si su clase tiene algunas propiedades que son de solo lectura, es decir, las establece el constructor y no se pueden cambiar después del tiempo de construcción, entonces tiene que hacer (un poco) más para que funcione. Puede crear una instancia personalizada de DefaultPersistenceDelegate que reconozca su clase, y sepa cómo pasar los datos apropiados a su constructor; simplemente le pasa los nombres de las propiedades como una lista, y hará el resto:
PersistenceDelegate fooDelegate = new DefaultPersistenceDelegate(new String[] {"propertyName1", "propertyName2"});
encoder.setPersistenceDelegate(Foo.class, fooDelegate);
Si su clase tiene argumentos de constructor que no se asignan directamente a propiedades con métodos getter, y/o existen otras complejidades para restaurar el estado del objeto, generalmente puede solucionarlos ampliando PersistenceDelegate e implementando el comportamiento necesario usted mismo.Sin embargo, si su clase es muy compleja de recrear en tiempo de ejecución y desea que se serialice, debe considerar seriamente rediseñarla para reducir su complejidad, esto hará que todo el proceso sea mucho más fácil y reducirá enormemente la posibilidad de errores, como además de facilitar el cambio y la ampliación en el futuro.
He encontrado que esto no funcione, el ejemplo xstream funcionó muy bien aunque – Sara
¿Qué es exactamente no funcionó para usted? Lo extraje del código de ejemplo de trabajo. ¿Implementaron los getters y setters en TestBean? Inserté solo un comentario apropiado para eso. – vanje
Esta implementación funciona para las clases que están codificadas según la convención de JavaBeans, pero para las clases arbitrarias definidas por el usuario es necesario asegurarse de que XMLEncoder tenga instalados los PersistenceDelegates correctos. No todas las clases tienen propiedades, y no todas las propiedades son escribibles: cuanto más lejos esté su clase de la convención JavaBeans, más esfuerzo tendrá que hacer. – Johansensen