2012-02-08 17 views
1

我試圖使用java.beans.XMLEncoder類將具有INetAddress類型成員的對象編碼爲xml。不幸的是,我得到以下異常:無法將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 SA YS:

XMLEncoder類是互補替代的ObjectOutputStream並且可以用於產生的JavaBean的文本表示[...]

(其強調)

Inet4Address不是JavaBean,因此不適合以這種方式進行序列化。

你必須使用不同的機制來實現你想要做的事情。 JAXB框架included as part of java6 and above是一個更健壯和通用的XML序列化框架。

+0

非常感謝您的快速回答! – mort 2012-02-08 08:19:00

2

您只需要爲Inet4Address類安裝持久委託。摘自Core Java Vol.8第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()}); 
    } 
});