Question

Disons que je crée une instance de la classe B, qui a une variable statique x, affectée d'une valeur de 3 dans la déclaration de classe B. Dans la principale méthode (), je fais ceci:

B b = new B();
b.x = 7; //allowed to use an instance to set the static member value

Après cela, b est sérialisé puis désérialisé. Ensuite, la ligne suivante se produit:

System.out.println ("static: " + b.x);

Quelle est la valeur? 7 ou 3?

Je sais que les variables statiques ne sont pas sérialisé, cependant, car il n'y a qu'une seule copie du membre statique pour toute la classe, et la valeur est réglée sur 7, devrait-il être conservé après de-sérialisation une instance?

Était-ce utile?

La solution

Voici ce qui se passe:

  1. initialiseur statique définit la valeur à 3.
  2. constructeur d'instance définit la valeur à 7.
  3. sérialisation ne connaît pas la variable statique et il est ignoré.
  4. De-sérialisation est pas au courant de la variable statique et il est ignoré.
  5. La valeur est encore 7 (à partir du changement survenu dans le constructeur) si le programme a été exécuté tout au long, ou si le programme a été arrêté et redémarré, l'initialiseur statique aura mis à 3 et désérialisation n'a pas changer.

Si vous voulez la logique que vous décrivez, vous devez ajouter une autre variable statique qui compte le nombre d'instances créées et remplacer les méthodes de writeObject et readObject avec votre logique personnalisée.

Autres conseils

Si vous désérialiser dans la même instance de la machine virtuelle Java, votre deuxième extrait retournera 7. En effet, est fixé à 7. la valeur de bx Cela n'a pas changé parce que une instance de B était sérialisé et désérialisé.

Si vous sérialiser l'objet, l'arrêt de la machine virtuelle Java, mettre en place une nouvelle machine virtuelle Java et désérialiser alors l'objet (sans réglage b.x autre que l'importe où l'initialisation statique), la valeur de b.x sera 3.

Utiliser le code suivant pour sérialiser et désérialiser et objet vers / à partir d'un courant en mémoire:

package com.example.serialization;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; 
import junit.framework.TestCase;


public class SerializationTest extends TestCase {
    public void testStaticValueAfterSerialization() {
       B b = new B();
       b.x = 7; //allowed to use an instance to set the static member value

       B deserializedB = copyObject(b);
       assertEquals("b.x should be 7 after serialization", 7, deserializedB.x);
    }

    private <T extends Serializable> T copyObject(final T source) {
        if (source == null)
                throw new IllegalArgumentException("source is null");
        final T copy;
        try {
            copy = serializationClone(source);
            } catch (Exception e) {
                // (optional) die gloriously!
            throw new AssertionError("Error copying: " + source, e);
        }    
            return copy;
    }

    private <T extends Serializable> T serializationClone(final T source)
        throws IOException, ClassNotFoundException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    ObjectOutputStream outputStream = new ObjectOutputStream(byteStream);

            // 1. serialize the object to the in-memory output stream
        outputStream.writeObject(source);

        ObjectInputStream inputStream = new ObjectInputStream(
                new ByteArrayInputStream(byteStream.toByteArray()));

        // 2. deserialize the object from the in-memory input stream
        @SuppressWarnings("unchecked")
            final T copy = (T) inputStream.readObject();

        return copy; // NOPMD : v. supra
    }
}

Après avoir créé cette classe, l'exécuter avec un coureur de JUnit et voir si le test passe! Si vous le souhaitez, vous pouvez écrire le résultat dans un fichier dans un cas de test. Puis, dans un autre cas de test, lisez le résultat d'un fichier!

Depuis initialiseurs statiques fonctionnent exactement une fois, la valeur est 7.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top