XMLEncoder를 사용하여 xml로 직렬화하는 클래스를 모든 변수와 함께 제공합니다. 보유하고있는 것을 제외하고 java.util.Locale. 트릭이 뭐지?Serializable java.lang.Locale
답변
java.util.Locale이 bean이 아닌 것이 문제입니다. XMLEncoder 문서에서 :
는XMLEncoder 클래스에서의 ObjectOutputStream에에 보완 대체하고 ObjectOutputStream를가하는데 사용될 수있는 것과 동일한 방식으로 자바빈의 텍스트 표현을 생성 에 사용될 수있는 의 이진 표현을 만들 수 있습니다.
샘플 콩 :
: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()); } }
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; } }
로케일 유형을 포함하는 데이터 그래프를 직렬화
그러나, API는이 아닌 콩 종류를 직렬화 PersistenceDelegates을 사용할 수 있습니다
이것은 비 직렬화시에 객체를 인스턴스화하는 방법을 설명하는 코드 섹션입니다. 세 개의 문자열 값을 생성자 인자 :
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() });
}
}
더 많은 정보를 원하시면 필립 밀른에 의해 Using XMLEncoder을 읽어보십시오.
이 모든 것 외에도, 로캘 정보를 텍스트 형식으로 저장하고 필요할 때마다 적절한 Locale 개체를 찾는 것이 더 스마트해질 수 있습니다. 그렇게하면 객체를 직렬화하고 더 이식성있게 만들 때 특별한 사례 코드가 필요하지 않습니다.
죄송합니다. java.util.Locale? JavaDoc에서 당신이 랭 패키지에서 로케일 클래스를 사용하여 아무 문제가 없어야하므로 java.util.Locale의이 직렬화를 구현하는 것을 말한다.
예, java.util입니다. 불행히도,이 일은 직렬화되지 않습니다. – yanchenko
질문은 java.io가 아닌 java.beans XMLEncoder를 사용하는 것입니다. 이진 직렬화. –
훌륭한 설명과 링크에 감사드립니다. BTW, implicitly 플러시 된 인코더를 닫으므로 encoder.close() 전에 encoder.flush() 할 필요가 없습니다. – yanchenko