天天看點

【XStream】XStream 忽略不重要點元素

        XStream 是一個偉大的庫來建立 XML 對象,反之亦然,和我使用它的很多的領域之一是存儲配置。一個問題是,XStream 已被忽略字段序列化對象,而不是相反時 — — 例如,如果它發現在您的類中沒有相應的屬性的标記,它将引發異常。它是不清楚我為什麼他們仍然沒有任何事情來處理這種情況下,是相當普遍發生。例如,您可能有一個 XML 和隻需要一小部分的資料,或者也許你改變你存儲配置和删除某些屬性的方式。在兩種情況下你将不得不映射的整個對象圖,即使你不想它。他們常見問題網頁國這: 

如果從類中删除字段,反序列化一個老的版本包含的字段将導緻引發異常。離開中的地方,但将它聲明為瞬态将避免該異常,但 XStream 不會試圖反序列化的字段。

我發現這種行為非常奇怪、 令人讨厭,但幸運的是有一種變通方法: XStream 類有一個名為 wrapMapper(MapperWrapper next) 子類可能實施告訴圖書館是否應視為一個給定的類或屬性的受保護的方法。在此方法中,您可以添加字段或你不想打擾,并為他們傳回 false 的類核查。簽出一個工作示例:  

XStream x = new XStream() {
    @Override
    protected MapperWrapper wrapMapper(MapperWrapper next) {
        return new MapperWrapper(next) {
            @Override
            @SuppressWarnings("rawtypes")
            public boolean shouldSerializeMember(Class definedIn, String fieldName) {
                if (fieldName.equals("shouldCopyWithProject")) {
                    return false;
                }
 
                return super.shouldSerializeMember(definedIn, fieldName);
            }
        };
    }
};           

在前面的示例中,過一個名為'shouldCopyWithProject'是在我的應用程式的較新版本中删除字段,但這種重構導緻崩潰時打開了的檔案從舊版本的應用程式,是以我不得不手動處理這種情況。如果 XStream 有一個清潔的解決方案為此,但這是非常不可能發生,這是巨大的。然而,這裡所述的方法很有效。

// .....
XStream x = new XStream();
x.omitField(A.class, "shouldCopyWithProject");
// .....           

原文位址:

點選