2012-02-08 7 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のと相補的代替物であるとのJavaBeanのテキスト表現を生成するために使用することができる[...]

(その強調)

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()}); 
    } 
}); 
関連する問題