有一个类可以很好地使用XMLEncoder与所有变量串行化为xml。除了持有 java.util.Locale 的那个。可能是什么伎俩?
答案 0 :(得分:7)
问题是java.util.Locale不是bean。来自XMLEncoder doc:
XMLEncoder类是一个 互补的替代品 ObjectOutputStream可以用来 生成一个文本表示 JavaBean 以同样的方式 ObjectOutputStream可用于 创建二进制表示 可序列化的对象。
但是,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;
}
}
序列化包含区域设置类型的数据图:
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的Using XMLEncoder了解更多信息。
除此之外,以文本形式存储区域设置信息并使用它在需要时查找相应的Locale对象可能更为明智。这样,在序列化对象并使其更具可移植性时,您不需要特殊的案例代码。
答案 1 :(得分:0)
抱歉,您不是指 java.util.Locale 吗? javadocs说 java.util.Locale 实现 Serializable ,因此使用 lang <中的 Locale 类应该没有问题/ em>包。