9
votes

Utilisations de ReadObject / WriDeObject en sérialisement

Je traversais Cet article pour comprendre plus À propos du processus de sérialisation Java. Lorsqu'il s'agit d'utilisations de lisechject / wriderObject je pouvais voir deux cas d'utilisation:

  1. Nous pouvons utiliser WriteObject pour chiffrer le code octet avant qu'il ne soit sérialisé. Du point de vue de la vue, c'est une bonne chose.
  2. Nous pouvons utiliser lisarobject 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 à déchiffrer le code d'octet qui était excruté lors de la sérialisation de l'objet.

    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?


1 commentaires

Pls met à jour le lien vers l'article.


6 Réponses :


4
votes

Il pourrait y avoir plusieurs raisons pour utiliser la sérialisation personnalisée:

  1. performance.
  2. interface avec des systèmes externes. (Au-delà de votre portée ou même simplement des systèmes non-Java.)
  3. besoin d'un format lisible par l'homme.
  4. Support pour les anciennes versions de classes sérialisées.

    Nommer juste quelques-uns quelques-uns, mais je suis sûr qu'il y en a beaucoup plus.


0 commentaires

5
votes

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.

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


0 commentaires

16
votes

Personnalisé ReadObject 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é.


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.


3 commentaires

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é.



3
votes

i chose de déchiffrement peut mieux être fait en utilisant un objetOutputStream basé sur une ciproutputtstream.

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).

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).


1 commentaires

Est-ce la raison pour laquelle cela (par exemple) La mise en œuvre linkedlist de Java implémente les méthodes WriteObject / ReadObject?



3
votes
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();
    }

}

0 commentaires

1
votes

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();
    }

}


0 commentaires