2012-03-20 2 views
1

Я искал на многих форумах, но еще не нашел ответа на вопрос. Я прочитал несколько тем от людей, имеющих ту же проблему, что и я, здесь, на этом сайте, но большинство из них использовали аплеты и сервлеты, и я не мог понять, что я делаю неправильно по сравнению с ними.java.io.StreamCorruptedException: недопустимый заголовок потока: 5B42403

В любом случае, по моей проблеме. Недавно я недавно изучил MySQL, поэтому, если вы видите что-нибудь ужасное, простите меня. Я пытаюсь взять сериализуемый объект и записать его в таблицу в MySQL. Из исследования, которое я сделал, я понял, что мне нужно использовать BLOB в качестве поля и что мне нужно будет написать его с помощью байта []. Написание работает отлично, никаких проблем, но когда я пытаюсь его прочитать, я получаю вышеуказанную ошибку.

Мой метод записи:

public void addColonist(String p, Colonist c) { 
     // Serializing the Colonist 
     ByteArrayOutputStream baos; 
     baos = new ByteArrayOutputStream(); 
     byte[] byteObject = null; 

     try { 
      out = new ObjectOutputStream(baos); 
      out.writeObject(c); 
      out.flush(); 
      out.close(); 
      baos.flush(); 

      byteObject = baos.toByteArray(); 
      baos.close(); 

     } catch (Exception e) { 
     e.printStackTrace(); 
     } 

     // Adding it to MySQL 
     sql.query("INSERT INTO colonistdb (`player`, `colonist`) VALUES('" + p + "', '" + byteObject + "')"); 
    } 

И мой чтения/найти метод:

public Colonist getColonist(String p) { 
     // Getting the object from MySQL 
     ResultSet rs = sql.query("SELECT `colonist` FROM colonistdb WHERE `player` = '" + p + "'"); 
     byte[] byteObject = null; 
     try { 
      if (rs.first()) { 
       byteObject = (byte[]) rs.getObject("colonist"); 
      } 
     } catch (SQLException e) { 
     return null; 
     } 

     if (byteObject == null) { 
      System.out.println("byteObject is null"); 
      return null; 
     } 

     // Deserializing it for use 
     ByteArrayInputStream bais; 
     Colonist colonist = null; 

     try { 
      bais = new ByteArrayInputStream(byteObject); 
      in = new ObjectInputStream(bais); 
      colonist = (Colonist) in.readObject(); 

      in.close(); 
      bais.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     System.out.println("Colonist successfully retrived"); 

     return colonist; 
    } 

Из того, что я прочитал на кучу других вопросов и сообщений, я, возможно, потребуется сделать ObjectOutputStream в моем методе чтения, но я старался, что без толку ...

Любая помощь очень ценится :)

+0

Я ответил на ваш вопрос, но вы не должны хранить ваши объекты в двоичном формате в базе данных. Каждый раз, когда вы вносите изменения в свой объект, например добавление или удаление, все старые, хранящиеся в базе данных, не смогут быть прочитаны правильно. Также вы не можете делать какие-либо запросы, как только выберите колонистов, у которых есть имя, начинающееся с «rich». В идеале, каждый класс, который вы не должны сохранять, должен иметь свою собственную таблицу в базе данных. – Hiro2k

+0

Ну, на самом деле это плагин для сервера minecraft, для которого я «работаю». Он не используется, поэтому проблема добавления/удаления полей на данный момент не является проблемой. Я всегда мог сделать обновление для старого файла, хотя я не мог? – Perdog

+2

@ Hiro2k Это неверно. Добавление или удаление полей не прерывает совместимость при сериализации. Это подробно обсуждается в главе «Версии объектов» в разделе «Сериализация объектов». – EJP

ответ

2

Вводите данные неправильно. Вам нужно использовать PreparedStatement, чтобы он работал.

+0

Будет ли то, что я прочитал его из таблицы, останется прежним? – Perdog

Смежные вопросы