2008-10-12 5 views
2

XMLEncoder를 사용하여 xml로 직렬화하는 클래스를 모든 변수와 함께 제공합니다. 보유하고있는 것을 제외하고 java.util.Locale. 트릭이 뭐지?Serializable java.lang.Locale

답변

7

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 개체를 찾는 것이 더 스마트해질 수 있습니다. 그렇게하면 객체를 직렬화하고 더 이식성있게 만들 때 특별한 사례 코드가 필요하지 않습니다.

+0

훌륭한 설명과 링크에 감사드립니다. BTW, implicitly 플러시 된 인코더를 닫으므로 encoder.close() 전에 encoder.flush() 할 필요가 없습니다. – yanchenko

0

죄송합니다. java.util.Locale? JavaDoc에서 당신이 패키지에서 로케일 클래스를 사용하여 아무 문제가 없어야하므로 java.util.Locale의직렬화를 구현하는 것을 말한다.

+0

예, java.util입니다. 불행히도,이 일은 직렬화되지 않습니다. – yanchenko

+1

질문은 java.io가 아닌 java.beans XMLEncoder를 사용하는 것입니다. 이진 직렬화. –