2012-10-23 29 views
0

我有一個Jtable它使用自定義渲染器和編輯器,它使用JTextPane作爲編輯器和渲染器,它使用DefaultStyledDocument作爲文本模型。該表格包含超鏈接,這些鏈接是具有HTML.Attribute.HREF屬性的文本。爲了挽救這個樣式文本到數據庫中,我需要將DefaultStyledDocument轉換成XML,並嘗試這樣做,將引發此異常:'HTML屬性不可序列化'異常(java)

javax.swing.text.html.HTML$Attribute is not serializable as a key in an AttributeSet .

我該如何解決這個問題?

回答

1

HTML.Attribute不是Serializable。出於某種原因,Java開發人員決定不將序列化支持添加到HTML.Attribute以及HTML.Tag。最可能的原因是,使用它們的HTMLDocument被序列化爲HTML文本,因此不需要直接序列化Java對象。

很容易修復,真的。創建自己的屬性:

public final class LinkAttribute implements Serializable { 
    private static final long serialVersionUID = -472010305643114209L; 

    public static final LinkAttribute HREF = new LinkAttribute("href"); 

    private final String name; 

    private LinkAttribute(final String name) { 
     this.name = name; 
    } 

    public boolean equals(final Object o) { 
     return o instanceof LinkAttribute 
       ? name.equals(((LinkAttribute) o).name) 
       : false; 
    } 

    public int hashCode() { 
     return name.hashCode(); 
    } 

    public String toString() { 
     return name; 
    } 
} 

這大致HTML.Attribute類的實現,與Serializable界面添加。

使用LinkAttribute.HREF無處不在您使用HTML.Attribute.HREF

+0

@Igor沒有必要在類聲明中指定'static'。它應該是一個頂級的類,其中靜態關鍵字對類修飾符無效。如果你在另一個類中使用它作爲嵌套類,那麼在你的聲明中加入'static'。 –

+0

在我的代碼中,我沒有創建類的實例,所以我需要指定它。 :)'String href =(String)a.getAttribute(LinkAttribute.HREF);' – Igor

+0

@Igor不,你不知道。關鍵字'static'用於使類成員屬於該類,而不是作爲類的實例的對象。對於頂級類,即如果您創建'LinkAttribute.java'並將代碼粘貼到那裏,向聲明中添加'static'會導致編譯時錯誤:*此處不允許修飾符靜態*。 –