2012-02-08 2 views
1

Я пытаюсь закодировать объект, который имеет член типа INetAddress, в xml, используя класс java.beans.XMLEncoder. К сожалению, я получаю следующее исключение:Не удается кодировать INetAddress в xml

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 са YS:

XMLEncoder класса является дополнительной альтернативой ObjectOutputStream и может использоваться для генерации текстового представления в JavaBean [...]

(их внимание)

Inet4Address не является JavaBean и поэтому не подходит для сериализации таким образом.

Вам нужно будет использовать другой механизм для достижения того, что вы пытаетесь сделать. Рамка JAXB, included as part of java6 and above, является более надежной и общей схемой сериализации XML.

+0

Большое спасибо за ваш быстрый ответ! – mort

2

Вам просто нужно установить делегат персистентности для класса Inet4Address. Адаптировано из примера в главе 8 из Core Java Vol. 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()}); 
    } 
});