Domanda

Ho una classe che si serializza in xml con XMLEncoder in modo corretto con tutte le variabili lì. Ad eccezione di quello che contiene java.util.Locale . Quale potrebbe essere il trucco?

È stato utile?

Soluzione

Il problema è che java.util.Locale non è un fagioli . Dal documento XMLEncoder :

  

La classe XMLEncoder è a   alternativa complementare al   ObjectOutputStream e può essere utilizzato per   generare una rappresentazione testuale di a    JavaBean allo stesso modo di   ObjectOutputStream può essere utilizzato per   creare una rappresentazione binaria di   Oggetti serializzabili.

Tuttavia, l'API ti consente di utilizzare PersistenceDelegates per serializzare i tipi non bean:

Esempio di bean:

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;
    }

}

Serializzazione di un grafico di dati che include un tipo di locale:

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());
    }

}

Questa è la sezione di codice che descrive come l'oggetto deve essere istanziato sulla deserializzazione: imposta gli argomenti del costruttore su tre valori di stringa:

    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() });
        }
    }

Leggi Uso di XMLEncoder di Philip Milne per maggiori informazioni.

A parte questo, potrebbe essere più intelligente archiviare le informazioni sulla locale in forma testuale e usarle per cercare l'oggetto Locale appropriato ogni volta che è necessario. In questo modo non è necessario un codice caso speciale per serializzare il tuo oggetto e renderlo più portatile.

Altri suggerimenti

Scusa, non intendi java.util.Locale ? I javadocs affermano che java.util.Locale implementa serializzabile , quindi non dovresti avere problemi ad usare la classe Locale dalla lang pacchetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top