當標準對象更改其版本(內容,字段命名)時,Java標準序列化並不是非常有用。它適用於快速演示項目。
更適合您的需求,是objetcs支持你自己的(二進制)自定義序列的方法:
這並不困難,使用DataOutputStream
寫出對象的所有領域。但現在通過首先寫出一個versionId
來引入versiong。只有一個版本的對象寫出versionId 1.這樣,稍後,當您必須在objetcs中引入更改時,可以刪除字段,添加字段,提高版本號。
這種ICustomSerializable
然後將第一讀出從輸入流中的版本號,在readObject()方法,並且取決於版本ID調用readVersionV1()或例如readVersionV2().
public Interface ICustomSerializable {
void writeObject(DataOutputStream dos);
Object readObject(DataInputStream dis);
}
public Class Foo {
public static final VERSION_V1 = 1;
public static final VERSION_V2 = 2;
public static final CURRENT_VERSION = VERSION_V2;
private int version;
private int fooNumber;
private double fooDouble;
public void writeObject(DataOutputStream dos) {
dos.writeInt(this.version);
if (version == VERSION_V1) {
writeVersionV1(dos);
} else (version == VERSION_V2) {
writeVersionV2(dos);
} else {
throw new IllegalFormatException("unkown version: " + this.version);
}
}
public void writeVersionV1(DataOutputStream dos) {
writeInt(this.fooNumber);
writeDouble(this.fooValue);
}
}
此外吸氣劑和setter,並且需要一個將版本初始化爲CURRENT_VERSION的構造函數。
如果您更改或添加適當的讀寫版本,這種serialisazion可以安全地重構。對於使用來自外部庫的類而不是您的控件的複雜對象,可以做更多的工作,但是字符串和列表很容易被序列化。
你能否澄清爲什麼像XStream這樣的東西不適合,爲什麼你絕對需要生成源代碼?這肯定會有助於獲得更好的答案。 – 2010-07-14 23:53:11
您想要現在解決的現場測試事件的測試用例的長期脆弱性有什麼問題? – 2013-01-12 23:51:02
@IraBaxter短期內沒有任何問題。但是如果有一些很酷的圖書館/技術/策略可以比我現在更好地處理這個問題,我想聽聽它。 – 2013-01-13 00:13:23