当前位置:  开发笔记 > 编程语言 > 正文

序列化java.lang.Locale

如何解决《序列化java.lang.Locale》经验,为你挑选了1个好方法。

得到了一个类,它与XMLEncoder串行化为xml,其中包含所有变量.除了持有java.util.Locale的那个.可能是什么伎俩?



1> McDowell..:

问题是java.util.Locale不是bean.从XMLEncoder doc:

XMLEncoder类是ObjectOutputStream的补充替代,可用于生成JavaBean的文本表示,其 方式与ObjectOutputStream可用于创建Serializable对象的二进制表示的方式相同.

但是,API允许您使用PersistenceDelegates序列化非bean类型:

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

}

序列化包含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());
    }

}

这是描述如何在反序列化时实例化对象的代码部分 - 它将构造函数参数设置为三个字符串值:

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

阅读使用 Philip Milne的XMLEncoder获取更多信息.

除此之外,以文本形式存储区域设置信息并使用它在需要时查找适当的Locale对象可能更为明智.这样,在序列化对象并使其更具可移植性时,您不需要特殊的大小写代码.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有