[英]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對象。 如果你是持久化java對象,它將是序列化。 Jaxb轉換嘗試將xml值綁定到類屬性。 只要轉換先決條件有效,就不會有問題。 其他庫如JIBX,嘗試直接訪問字節碼。 在這種情況下,類版本可能是一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.