2012-02-08 2 views
1

java.beans.XMLEncoder 클래스를 사용하여 INetAddress 형식의 멤버가 xml 인 개체를 인코딩하려고합니다.XML에 INetAddress를 인코딩 할 수 없습니다.

가 java.lang.IllegalAccessException : 클래스 sun.reflect.misc.Trampoline는 수정과 클래스 java.net.Inet4Address의 멤버에 액세스 할 수 없습니다 ""

불행하게도, 나는 다음과 같은 예외가

public class INetAddressFoo { 

    private InetAddress addr; 

    public INetAddressFoo() { 
    } 

    public InetAddress getAddr() { 
     return addr; 
    } 

    public void setAddr(InetAddress addr) { 
    this.addr = addr; 
    } 
} 

public class Test{ 

    public static void main() throws Exception { 
     INetAddressFoo foo = new INetAddressFoo(); 
     InetAddress addr = InetAddress.getByName("localhost"); 
     foo.setAddr(addr); 
     File file = new File("inet.xml"); 

     XMLEncoder encoder = null; 

     try { 
      encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(file))); 
      encoder.writeObject(t); 
     } finally { 
      if (encoder != null) { 
      encoder.close(); 
      } 
     } 
    } 

} 

답변

4

javadoc for XmlEncoder SA : 여기 내 코드입니다 YS :

XMLEncoder 클래스 ObjectOutputStream에 보완적인 대안 및 자바빈의 텍스트 표현을 생성하기 위해 사용될 수있다 [...]

(강조점)

Inet4Address은 JavaBean이 아니므로이 방식으로 직렬화에 적합하지 않습니다.

당신이하려는 것을 달성하기 위해서는 다른 메커니즘을 사용해야합니다. JAXB 프레임 워크, included as part of java6 and above은보다 견고하고 일반적인 XML 직렬화 프레임 워크입니다.

+0

답장을 보내 주셔서 감사합니다. – mort

2

Inet4Address 클래스의 지속성 대리자 만 설치하면됩니다. Core Java Vol. 8의 예제에서 수정되었습니다. 2 :

e.setPersistenceDelegate(Inet4Address.class, new DefaultPersistenceDelegate() { 
    @Override 
    protected Expression instantiate(Object oldInstance, Encoder out) { 
     InetAddress old = (InetAddress) oldInstance; 
     return new Expression(oldInstance, InetAddress.class, "getByAddress", 
      new Object[]{old.getAddress()}); 
    } 
}); 
관련 문제