簡體   English   中英

JAXB和類的不同版本

[英]JAXB and different versions of the class

我想知道在JAXB中是否支持不同版本的類。 我對它的看法:xml是類的一種持久化對象(序列化值),但是由於開發(例如擴展功能),可以改變類對象。 有沒有辦法知道只使用JAXB API在持久性(read:xml)中存儲哪個版本的類?

對我來說,存儲類版本似乎很方便 - 就像它在標准java序列化機制(我的意思是serialVersionUID)中所做的那樣,並提供在類上映射xml的功能,即使在不同版本的情況下(例如,在XmlAdapter中添加關於存儲在xml中的類的版本的信息) )。 默認情況下,如果xml和運行時中的類版本不同 - 拋出InvalidClassException。

示例:我們的課程測試如下:

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {

    private Long time;

    private Test () {}; 
}

假設時間是以毫秒為單位的UNIX時間。

此代碼在生產時發布,此類作為xml保存在數據庫中。 下一個版本顯示使用Long作為時間表示並且它已更改為Date不是一個好選擇:

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {

    private Date time;

    private Test () {}; 
}

現在有兩種方法 - 遷移持久化數據或編寫將處理長時間並將其應用於日期時間的xml適配器。

如果我們選擇第二種方式,那么如果JAXB API提供存儲在xml中的類版本(假設在class = 0版本中沒有指定類版本)並且我們顯式添加新版本的類(通過注釋或靜態)領域):

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlClassVersion(value = 1)
public class Test {

    private Date time;

    private Test () {}; 
}

要么

@XmlRootElement
@XmlAccessorType(value = XmlAccessType.FIELD)
public class Test {

    private static final long xmlSerialVersionUID = 1;

    private Date time;

    private Test () {}; 
}

和JAXB將提供如下的XmlAdapter:

public abstract class XmlAdapter<ValueType,BoundType> {
    protected XmlAdapter() {}
    public abstract BoundType unmarshal(ValueType v, long classVersion) throws Exception;

    public abstract ValueType marshal(BoundType v, long classVersion) throws Exception;
}

當然,為了支持多個版本,我們需要實現這樣的適配器並明確地處理不同的版本。 顯然,JAXB將在xml中添加有關類的特殊信息,並將在最新的類版本上生成xml。

注意:上面示例中的點我們在持久性中同時有2個不同的類表示,但仍然可以將它們映射到運行時中可用的類的版本。

JAXB代表“用於XML綁定的Java體系結構”,因此,它是關於將對象字段值綁定到XML元素/屬性,而不是關於序列化java對象。 在你閱讀本文的例子 ,你看到它說

javax.xml.bind,包含用於執行解組,編組和驗證等操作的類和接口

Java對象序列化是另一回事,它與您在問題中提到的serialVersionUID有關。

如果您使用的是JAXB,那么您將持久化xml而不是Java對象。 如果你是持久化java對象,它將是序列化。 Jaxb轉換嘗試將xml值綁定到類屬性。 只要轉換先決條件有效,就不會有問題。 其他庫如JIBX,嘗試直接訪問字節碼。 在這種情況下,類版本可能是一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM