Не могу закодировать INetAddress в xml - PullRequest
1 голос
/ 08 февраля 2012

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

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();
          }
       }
    }

}

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Javadoc для XmlEncoder говорит:

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

(их акцент)

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

Вам придется использовать другой механизм для достижения того, что вы пытаетесь сделать. Инфраструктура JAXB, , включенная как часть java6 и выше , является более надежной и общей платформой сериализации XML.

2 голосов
/ 01 сентября 2012

Вам просто нужно установить персистентный делегат для класса 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()});
    }
});
...