Serializzazione di java.lang.Locale
-
10-07-2019 - |
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?
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.