java.lang.Localeのシリアル化
-
10-07-2019 - |
質問
XMLEncoderを使用して、すべての変数を適切にXMLにシリアル化するクラスを取得します。 java.util.Locale を保持するものを除きます。トリックは何ですか?
解決
問題は、java.util.Localeが bean 。 XMLEncoder ドキュメントから:
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());
}
}
これは、逆シリアル化時にオブジェクトをインスタンス化する方法を説明するコードのセクションです。コンストラクタの引数を3つの文字列値に設定します。
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オブジェクトを検索する方が賢明かもしれません。そうすれば、オブジェクトをシリアル化する際に特別なケースコードを必要とせず、よりポータブルにできます。
他のヒント
申し訳ありませんが、あなたは java.util.Locale を意味しませんか? javadocsでは、 java.util.Locale は Serializable を実装しているため、 lang パッケージ。