Pregunta

Obtuve una clase que serializa en xml con XMLEncoder muy bien con todas las variables allí. Excepto por el que contiene java.util.Locale . ¿Cuál podría ser el truco?

¿Fue útil?

Solución

El problema es que java.util.Locale no es un frijol . Del XMLEncoder doc. :

  

La clase XMLEncoder es un   alternativa complementaria a la   ObjectOutputStream y se puede utilizar para   generar una representación textual de un    JavaBean de la misma manera que el   ObjectOutputStream se puede usar para   crear una representación binaria de   Objetos serializables.

Sin embargo, la API le permite utilizar PersistenceDelegates para serializar tipos que no sean bean:

Bean de muestra:

public class MyBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Locale locale;
    private String foo;

    public MyBean() {
    }

    public Locale getLocale() {
        return locale;
    }

    public void setLocale(Locale locale) {
        this.locale = locale;
    }

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

}

Serializar un gráfico de datos que incluye un tipo de configuración regional:

public class MyBeanTest {

    public static void main(String[] args) throws Exception {
        // quick and dirty test

        MyBean c = new MyBean();
        c.setLocale(Locale.CHINA);
        c.setFoo("foo");

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        XMLEncoder encoder = new XMLEncoder(outputStream);
        encoder.setPersistenceDelegate(Locale.class, new PersistenceDelegate() {
            protected Expression instantiate(Object oldInstance, Encoder out) {
                Locale l = (Locale) oldInstance;
                return new Expression(oldInstance, oldInstance.getClass(),
                        "new", new Object[] { l.getLanguage(), l.getCountry(),
                                l.getVariant() });
            }
        });
        encoder.writeObject(c);
        encoder.flush();
        encoder.close();

        System.out.println(outputStream.toString("UTF-8"));

        ByteArrayInputStream bain = new ByteArrayInputStream(outputStream
                .toByteArray());
        XMLDecoder decoder = new XMLDecoder(bain);

        c = (MyBean) decoder.readObject();

        System.out.println("===================");
        System.out.println(c.getLocale());
        System.out.println(c.getFoo());
    }

}

Esta es la sección de código que describe cómo se debe instanciar el objeto en la deserialización: establece los argumentos del constructor en tres valores de cadena:

    new PersistenceDelegate() {
        protected Expression instantiate(Object oldInstance, Encoder out) {
            Locale l = (Locale) oldInstance;
            return new Expression(oldInstance, oldInstance.getClass(),
                    "new", new Object[] { l.getLanguage(), l.getCountry(),
                            l.getVariant() });
        }
    }

Lea Uso de XMLEncoder de Philip Milne para obtener más información.

Aparte de todo esto, podría ser más inteligente almacenar la información de la configuración regional en forma de texto y usarla para buscar el objeto de configuración regional apropiado cuando sea necesario. De esa manera, no necesita un código de caso especial al serializar su objeto y hacerlo más portátil.

Otros consejos

Lo siento, ¿no te refieres a java.util.Locale ? Los javadocs dicen que java.util.Locale implementa Serializable , por lo que no debería tener problemas para usar la clase Locale de lang paquete.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top