Partage
  • Partager sur Facebook
  • Partager sur Twitter

MySQL, stocker et récuupérer un Objet

    12 novembre 2010 à 22:49:02

    Salut tout le monde,

    j'ai un petit problème pour stocker un Objet et le récupérer ensuite avec ma base de donné SQL, dans la base je stock un byte[] sous le type Blob, en ensuite je récupère le blob et réobtiens un byte[] pour ensuite le transformer en Objet.

    Mais voilà, cela ne marche pas, mais tout ces mots seront plus compréhensible avec du code, voilà donc le bout de code mentionné. Je précise que d'autre requête à la DB, comme des int par exemple vont très bien : le but du programme est de stocké un Objet Meal (qui est serializable) avec l'information du jour, semaine etc.
    public boolean storeMeal(int id, int restId, Meal meal, int day, int week,
    			int year) {
    		
    		try {
    
    			this.connect("\"storeMeal(" + id + ", " + restId + ", "
    					+ meal.getName() + ")\"");
    
    			ByteArrayOutputStream baos;
    
    			ObjectOutputStream out;
    
    			baos = new ByteArrayOutputStream();
    
    			try {
    
    				out = new ObjectOutputStream(baos);
    
    				out.writeObject(meal);
    
    				out.close();
    
    			} catch (IOException e) {
    
    				e.printStackTrace();
    				return false;
    
    			}
    
    			// Get a Statement object
    			stmt = con.createStatement();
    
    			// Execute a select statement.
    			stmt.executeUpdate("INSERT INTO meals (id, restaurantID, day, week, year, mealObject) VALUES('"
    					+ id
    					+ "', '"
    					+ restId
    					+ "', '"
    					+ day
    					+ "', '"
    					+ week
    					+ "', '" + year + "', '" + baos.toByteArray() + "')");
    
    			// For each entry returned, we create its corresponding Poi Object
    
    			this.disconnect();
    
    		} catch (SQLException e) {
    			e.printStackTrace();
    			return false;
    		}
    
    		return true;
    	}
    


    Voilà pour la partie pour stocker sur la base, je précise que la connection à la base et l'écriture est correct, les informations se retrouve bien sur la DB, ensuite pour récupérer:

    public Collection<Meal> getMealsOfToday(int day, int week, int year) {
    		ArrayList<Meal> collMeal = new ArrayList<Meal>();
    		try {
    
    			this.connect("\"getMEALS_OF_TODAY\"");
    
    			// Get a Statement object
    			stmt = con.createStatement();
    
    			// Execute a select statement.
    			rs = stmt.executeQuery("SELECT * " + "from meals WHERE (day = '"
    					+ day + "' AND week = '" + week + "' AND year = '" + year
    					+ "')");
    
    			while (rs.next()) {
    				Blob blob = rs.getBlob("mealObject");
    				Meal meal = (Meal) byteToObject(blob.getBytes((long) 1,
    						(int) blob.length()));
    				collMeal.add(meal);
    			}
    
    			this.disconnect();
    
    		} catch (SQLException e) {
    			e.printStackTrace();
    			return null;
    		}
    		return collMeal;
    	}
    
    
    private Object byteToObject(byte[] bytes) {
    		Object object = null;
    		try {
    			object = new java.io.ObjectInputStream(
    					new java.io.ByteArrayInputStream(bytes)).readObject();
    		} catch (java.io.IOException ioe) {
    			ioe.printStackTrace();
    		} catch (java.lang.ClassNotFoundException cnfe) {
    			cnfe.printStackTrace();
    		}
    		return object;
    	}
    


    Voilà, tout ça ne marche pas,au dernière nouvelle, c'est la méthode byteToObject qui merde, elle n'arrive pas à reconstruire l'objet, mais c'est surement que le byte[] est corrompu, car j'ai essayé cette méthode avec un objet tout con auquel j'avais directement tiré un byte[] et ça marchait d'enfer.

    J'espère que c'est un peu clair tout ce que j'ai raconté (Je suis fin crevé, mais j'ai ce truc que je dois absolument faire)

    Merci d'avance

    Born To Eat

    Quelques information supplémentaire, l'erreur qu'on me donne en executant ça est : java.io.StreamCorruptedException: invalid stream header: 5B424037
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297)
    at org.pocketcampus.server.database.DatabaseManager.byteToObject(DatabaseManager.java:478)
    at org.pocketcampus.server.database.DatabaseManager.getMealsOfToday(DatabaseManager.java:381)
    at org.pocketcampus.server.server.ServerThread.run(ServerThread.java:331)


    J'ai aussi fait un autre essaie, de stocker le tableau de byte dans un varbinnary de taille 1024, et d'ensuite faire un Meal meal = (Meal) byteToObject(rs.getBytes("mealObject"));, mais j'ai toujours la même erreur,

    voilà, merci

    Tschüss
    • Partager sur Facebook
    • Partager sur Twitter

    MySQL, stocker et récuupérer un Objet

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown