Frage

eine Klasse erhielt, die mit XMLEncoder in xml serialisiert schön mit allen Variablen gibt. Mit Ausnahme der eine, die hält java.util.Locale . Was könnte der Trick sein?

War es hilfreich?

Lösung

Das Problem ist, dass java.util.Locale ist keine Bohne . Aus dem XMLEncoder doc :

  

Die XMLEncoder Klasse ist ein   komplementäre Alternative zum   Object und verwendet wird, kann zu   eine Textdarstellung eines generieren    JavaBean in der gleichen Art und Weise, dass die   Object kann verwendet werden,   Erstellen Binärdarstellung   Serialisierbare Objekte.

Allerdings ist die API können Sie PersistenceDelegates verwenden nicht-Bean-Typen serialisiert:

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

}

Die Serialisierung einer Daten grafische Darstellung, die eine Locale Art umfasst:

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

}

Dies ist der Abschnitt von Code, der beschreibt, wie das Objekt sollte auf Deserialisierung instanziiert werden - es ist die Konstruktor Argumente zu drei String-Wert setzt:

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

Lesen Sie Mit XMLEncoder von Philip Milne für weitere Informationen.

Das alles beiseite, könnte es klüger sein, um die Locale-Informationen in Textform zu speichern und verwenden, um das entsprechende Locale-Objekt zu sehen, wenn es gebraucht wird. Auf diese Weise brauchen Sie keine speziellen Fall Code, wenn Ihr Objekt Serialisierung und machen es mehr tragbar.

Andere Tipps

Sie haben leider nicht bedeuten java.util.Locale ? Die javadocs sagen, dass java.util.Locale Geräte Serializable , so dass Sie kein Problem haben, sollten mit der Locale Klasse von der lang Paket.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top