Je suis confronté à quelques problèmes lors de la sérialisation des objets (j'utilise JBoss Drools, et je veux stocker une ArrayList de KnowledgePackage).ce qui pourrait modifier le SerialVersionUID tout en sérialisant et en stockant dans un Jarfile?
Lorsque je sérialise la liste, stocke le résultat dans un fichier et le désérialise, aucun problème ne se produit, donc cela fonctionne correctement.
Mais quand je sérialiser la liste, stocker le résultat dans un flux d'octets, puis enregistrez-le dans un fichier Jar, je ne peux pas alors désérialiser le résultat, en raison de cette erreur:
IOException during package import : java.util.ArrayList; local class incompatible: stream classdesc serialVersionUID = 8664875232659988799, local class serialVersionUID = 8683452581122892189
Je pense donc la question est quand je sauve l'objet sérialisé dans une entrée Jarfile. Je pense que je fais cela correctement, car d'autres fichiers sauvegardés de la même manière dans le Jarfile peuvent être lus correctement. Et après avoir utilisé 'cmp' et 'hexdump', j'ai repéré que le sauver un pot provoque une variation d'un octet si l'uuid, sinon le contenu est le même.
Je suis vraiment déçu et ne peux pas indiquer où le problème peut être.
Que peut modifier le SerialVersionUID entre deux classes? autre qu'une autre version de vm?
ajouter le code source: 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;
}
Ceci n'a rien à voir avec uuid qui est un sujet complètement séparé; J'ai édité votre question –
à droite, je me suis confondu avec serialVersionUID et UUID. Merci pour l'édition. – ipingu