2013-06-26 3 views
0

Je suis en train de sérialiser et de désérialiser un grand ensemble d'objets en deux dimensions. Chaque objet contient des instructions pour créer un BufferedImage - ceci est fait pour contourner BufferedImage n'étant pas directement sérialisable lui-même.Changement de tableau bidimensionnel pendant la sérialisation

La classe étant sérialisé est:

public final class MapTile extends TransientImage 
{ 
    private static final long serialVersionUID = 0; 
    private transient BufferedImage f; 
    transient BufferedImage b; 
    int along; 
    int down; 
    boolean flip = false; 
    int rot = 0; 

    public MapTile(World w, int a, int d) 
    { 
     // f = w.getMapTiles(); 
     along = a; 
     down = d; 
     assignImage(); 
    } 

    public MapTile(World w, int a, int d, int r, boolean fl) 
    { 
     // f = w.getMapTiles(); 
     along = a; 
     down = d; 
     rot = r; 
     flip = fl; 
     assignImage(); 
    } 

    public int getA() 
    { 
     return along; 
    } 

    public int getD() 
    { 
     return down; 
    } 

    @Override 
    public void assignImage() 
    { 
     if (f == null) 
     { 
      f = World.mapTiles; 
     } 
     b = f.getSubimage(along, down, World.squareSize, World.squareSize); 
     if (rot != 0) 
     { 
      b = SmallMap.rotateImage(b, rot); 
     } 
     if (flip) 
     { 
      b = SmallMap.flipImage(b); 
     } 
     super.setImage(b); 
     f.flush(); 
     b.flush(); 
     f = null; 
     b = null; 
    } 
} 

qui étend:

public abstract class TransientImage implements Serializable 
{ 
    private transient BufferedImage image; 

    public BufferedImage getImage() 
    { 
     return image; 
    } 

    public void setImage(BufferedImage i) 
    { 
     image = i; 
    } 

    public abstract void assignImage(); 

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException 
    { 
     in.defaultReadObject(); 
     assignImage(); 
    } 
} 

Ce sera finalement partie d'une carte - le plus souvent il est créé au hasard, mais certaines zones doit être le même à chaque fois , donc en les sérialisant et en relisant le tableau. Comme je n'aurai jamais besoin de sauvegarder l'image pendant un usage normal, je mets le code d'écriture:

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("verticalroad.necro"))) 
{ 
    //out.writeObject(mapArray); 
    //} 
    //catch (IOException e) { 
//} 

dans la classe qui crée la carte, le code de lecture:

try{ 
     FileInputStream door = new FileInputStream(new File(f.getPath()+ "//verticalroad.necro")); 
     ObjectInputStream reader = new ObjectInputStream(door); 
     homeTiles = (MapTile[][]) reader.readObject(); 
     } 
    catch (IOException | ClassNotFoundException e) 
     { 
      System.out.println("Thrown an error" + e.getMessage()); 
     } 

dans la classe et les commentaires en initialisation et en fonction des besoins.

Cependant. Chaque fois que je lance le programme, le contenu du tableau à deux dimensions (mapArray en écriture, homeTiles en lecture) est différent. Non seulement différent de celui que j'ai (pensé) j'ai écrit, mais aussi différent chaque fois que le programme est ouvert.

Comme on peut le voir, j'imprime le toString à System.out qui révèle d'autres bizarreries. Comme c'est juste un tableau standard, le toString n'est pas utile à 100% mais il semble faire un cycle entre plusieurs valeurs distinctes. Cependant, même lorsque le toStringg donne la même valeur, le contenu du tableau affiché n'est pas le même.

Un exemple d'un toString est hometiles:[[Lriseofthenecromancer.MapTile;@7681720a regardant la documentation Array.toString (here), il semble être mal formé, manque une fuite]. Je ne suis pas sûr si c'est un indice de la question ou si c'est simplement que le tableau est très grand (plusieurs milliers d'objets) et c'est un problème d'espace d'affichage (j'utilise NetBeans).

Tout renseignement sur les raisons pour lesquelles cela change serait apprécié. Mon hypothèse de travail est que c'est sérialiser le tableau mais pas le contenu. Mais je n'ai aucune idée a) si c'est le cas et b) si c'est le cas, que faire à ce sujet.

EDIT: En regardant un peu plus loin, il semble que les variables d'instance ne sont pas définies immédiatement. Les imprimer directement après l'appel à setImage() les a tous à zéro, les imprimer depuis la classe appelante les a où ils devraient être.

+0

Oups, merci pour la faute de frappe ici @Jim Garrison – MrB

+1

Vous obtiendrez beaucoup plus d'attention si vous prenez soin de formater correctement votre code (indentation correcte, supprimer les caractères de tabulation) avant de le poster. –

+0

Où est votre 'toString()' pour 'MapTile'?Avez-vous essayé d'écrire 'toString()' et de voir si le contenu a réellement changé? –

Répondre

-1

Le problème sous-jacent était que je suis un idiot. L'expression spécifique de ceci dans ce cas particulier était que j'avais oublié que les sous-classes ne pouvaient hériter de méthodes privées. Par conséquent, l'appel assignImage n'a pas été effectué et l'image n'a pas été configurée.

Nous sommes désolés de perdre du temps à regarder ça. Je me sens très embarrassé.