Je traversais Cet article pour comprendre plus À propos du processus de sérialisation Java. Lorsqu'il s'agit d'utilisations de Y a-t-il un autre scénario pratique que vous avez rencontré lors de la sérialisation / désérialisant des objets en écrivant la méthode CustomR ReadObject / WriteObject? Ou si vous pouviez me signaler à n'importe quel endroit où je pouvais voir des utilisations décentes et pratiques de ReadObject / WrdiolObject? P> lisechject / wriderObject code> je pouvais voir deux cas d'utilisation: p>
WriteObject code> pour chiffrer le code octet avant qu'il ne soit sérialisé. Du point de vue de la vue, c'est une bonne chose. Li>
lisarobject code> pour exécuter n'importe quel code de code spécifique qui doit être exécuté immédiatement après la désérialisation et hors du parcours de Poin # 1, nous pouvons même utiliser
lisaBject code> à déchiffrer le code d'octet qui était excruté lors de la sérialisation de l'objet. Li>
ol>
6 Réponses :
Il pourrait y avoir plusieurs raisons pour utiliser la sérialisation personnalisée: p>
Nommer juste quelques-uns quelques-uns, mais je suis sûr qu'il y en a beaucoup plus. P>
Vous pouvez vous implémenter propre ReadObject / WriteObject pour des raisons de performances ou des raisons de compatibilité en arrière, ou parce qu'un champ que vous souhaitez sérialiser n'est pas sérialisable. P>
Pour de bons exemples de ReadObject / WrdiolObject, je regarderais dans la source qui est livré avec le JDK. Ou j'essaierais http://www.google.co.uk/search Q = ReadObject + WriteObject + Exemples P>
Personnalisé BTW, consultez Efficace Java , Chapitre 11 (je ne suis pas sûr de ce que le numéro du chapitre / de l'élément est au 2e ed.). C'est une excellente lecture sur la sérialisation. P> ReadObject code> Les méthodes sont également utiles lorsque vous devez initialiser les champs transitoires (non sérialisés) après que l'objet a été désérialisé. P>
En fait, c'est ... Je cherchais des commentaires sur la manière dont il a été utilisé exactement dans votre application. Bien que la sérialisation personnalisée soit une chose fantaisie, mais l'initialisation des variables transitoires ou statiques dans ReadObject () est souvent utilisée.
@Vicky: "En fait," comme dans, le lien Java efficace répond à votre question?
Oui je regarde maintenant dans le livre. Mais votre réponse sur l'initialisation du champ transitoire m'a aidé.
i chose de déchiffrement peut mieux être fait en utilisant un objetOutputStream basé sur une ciproutputtstream. P>
L'utilisation la plus importante de WriteObject / ReadObject est si vous souhaitez garder la sérialisation stable sur plusieurs révisions de code. Votre représentation interne (variables de membre) peut changer, mais la sérialisation doit être stable car il existe un ancien système que vous communiquez avec (par exemple en lisant les anciennes données à partir de fichiers). P>
Mais je préfère l'interface externalisable pour ces cas car il est plus facile à utiliser (aucun appels et méthodes implicites que seul le JVM sait). P>
Est-ce la raison pour laquelle cela (par exemple)
public class Employee implements Serializable { private static final long serialVersionUID = 1L; private int empno; private String ename; private String job; // setter & getter @Override public String toString() { return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job + "]"; } private void writeObject(ObjectOutputStream out) throws IOException { // default serialization // out.defaultWriteObject(); // custom serialization out.writeInt(empno); out.writeUTF(ename); // out.writeUTF(job); //job will not serialize } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // default deSerialization // in.defaultReadObject(); // custom deSerialization empno = in.readInt(); ename = in.readUTF(); // this.job = in.readUTF(); } }
Les méthodes WriteObject () et ReadObject () sont également utilisées pour la prévention d'une série d'objets. strong> Lorsqu'une classe de classe implémente Serializable toutes ses sous-classes sont sérialisables par défaut. Mais si vous souhaitez qu'une sous-classe ne soit pas sérialisable, remplacez les méthodes WrdiolObject () et ReadObject () dans la sous-classe comme ci-dessous P> class Parent implements Serailizable
{
int id;
}
class child extends Parent
{
String name;
private void writeObject(ObjectOutputStream out) throws NotSerializableException
{
throw new NotSerializableException();
}
private void readObject(ObjectInputStream in) throws NotSerializableException
{
throw new NotSerializableException();
}
}
Pls met à jour le lien vers l'article.