オブジェクトのシリアル化中にいくつかの問題に直面しています (JBoss Drools を使用しており、KnowledgePackage の ArrayList を保存したいと考えています)。
リストをシリアル化し、結果をファイルに保存し、逆シリアル化すると、問題は発生しないので問題なく動作します。
しかし、リストをシリアル化し、結果をバイトストリームに保存してから、JarFile に保存すると、このエラーのために結果を逆シリアル化できません:
IOException during package import : java.util.ArrayList; local class incompatible: stream classdesc serialVersionUID = 8664875232659988799, local class serialVersionUID = 8683452581122892189
したがって、シリアル化されたオブジェクトを Jarfile エントリに保存するときに問題があると思います。Jarfileに同じ方法で保存された他のファイルを正しく読み取ることができるので、私はこれを正しく行っていると思います。そして、「cmp」と「hexdump」を使用した後、jar に保存すると、uuid の場合は 1 オクテットの変動が生じ、それ以外の場合は内容が同じであることがわかりました。
私は本当にがっかりしており、問題がどこにあるのかを述べることができません.
2 つのクラス間で SerialVersionUID を変更できるものは何ですか? 別の vm バージョン以外の ?
ソースコードの追加: exportToJar -> writeRulesPackageEntry -> writeEntry
/**
* Writes content provided from a reader into a file contained in a jar.
*
* @param output the output stream to write on
* @param entryName the name of the file that will contain reader data
* @param contentReader
*
* @return the zip entry that has been created into the jar
*/
ZipEntry writeEntry(JarOutputStream output, String entryName, ByteArrayInputStream input) {
if (output == null || entryName == null || entryName.trim().length() == 0 || input == null) {
throw new NullPointerException("Null argument passed");
}
ZipEntry entry = new ZipEntry(entryName);
byte[] buffer = new byte[BUFFER_LENGTH];
try {
output.putNextEntry(entry);
int nRead;
while ((nRead = input.read(buffer, 0, BUFFER_LENGTH)) > 0) {
output.write(buffer, 0, nRead);
}
output.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
return entry;
}
/**
* Export rules files to a serialized object (ArrayList<KnowledgePackage>) into
* an output stream, then write the output content as an entry of a jar.
*
* @param os the output jar to write in
*/
void writeRulesPackageEntry(JarOutputStream os) {
// serialize objects and write them to the output stream
ByteArrayOutputStream output = new ByteArrayOutputStream();
RulesPackaging rulesPackaging = new RulesPackaging();
rulesPackaging.exportResources(this.rules, output);
// create a new input stream to read written objects from
ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
this.writeEntry(os, Product.ENTRY_RULES_PACKAGE, input);
}
/**
* Creates a JarFile containing resources.
*
* @param filename the exported jar filename
* @return the jar as an object, null if an error occured
*/
public JarFile exportToJar(String filename) {
FileOutputStream fOs;
JarOutputStream jOs;
JarFile jar = null;
try {
fOs = new FileOutputStream(filename);
jOs = new JarOutputStream(fOs);
this.writeRulesPackageEntry(jOs);
jOs.close();
// construct a jar from the output jar
jar = new JarFile(new File(filename));
} catch (IOException e) {
e.printStackTrace();
}
return jar;
}