2016-03-30 10 views
1

Я пытаюсь сохранить свой объект в базе данных MySQL с использованием java-языка. Я пытаюсь преобразовать объект в байт, чтобы сохранить его в LONGBLOB. Но я столкнулся с ошибкой i.e «NotSerializable Exception».Сохранение объекта в базе данных в Java

Мой класс, объект, который я хочу болячку:

public class Books implements Serializable { 

private int isbn; 
private String bookName; 
private String author; 
private String edition; 
private int rowNo; 
private int colNo; 
private String shelfNo; 
private String img; 
private InputStream imag; 
validation v = new Validation(); 
Database database; 

public Books() { database = new Database(); } 
. 
. 
setters & getters... 

метода для вызова метода базы данных для вставки объекта в базе данных:

String className = this.getClass().getName(); 
database.insertBookRecord(this.getIsbn(), this, className); 

this является объектом текущего класса, который я хочу, чтобы сохранить ,

следующий insertBookRecord способ.

public void insertBookRecord(int isbn, Books book, String name) { 
    String query = "INSERT INTO Test VALUES (?, ?, ?)"; 
    byte[] data = null; 
    //book = new Books(); 
    try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(book); 
     oos.flush(); 
     oos.close(); 
     baos.close(); 
     data = baos.toByteArray(); 
    } 
    catch(IOException ex) { 
     JOptionPane.showMessageDialog(null, ex.getMessage()); 
    } 

    try { 

     //conn.setAutoCommit(false); 
     state = conn.prepareStatement(query); 
     state.setInt(1, isbn); 
     state.setString(2, name); 
     state.setObject(3, data); 
     state.executeUpdate(); 
     //conn.commit(); 
    } 
    catch(SQLException ex) { 
     JOptionPane.showMessageDialog(null, ex.getMessage()); 
    } 
    finally { 
     close(3); 
    } 
} 

Когда я достигаю в заявлении oos.writeObject(book); ограничителей исключением и отображает пакет & Classname в JOptionPane.

В моем книжном объекте есть все поля данных, которые я ввел в текстовые поля. Но я не могу его написать./Конвертировать в формат Serializable.

Любые предложения, пожалуйста?

Трассировка стека:

java.io.NotSerializableException: com.my.classes.Database 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at com.my.classes.Database.insertBookRecord(Database.java:123) 
at com.my.classes.Books.insertBookRecord(Books.java:107) 
at com.my.jlms.ManageBooks$2.actionPerformed(ManageBooks.java:308) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+0

Нам нужно будет увидеть «поля» в вашем классе «Книги». Или еще лучше, что-то там не 'Serializable' – 3kings

+0

Возможно, одно или несколько полей внутри вашего класса Book не являются сериализуемыми. Где твой стек? – f1sh

+0

Я обновил поля. – nix

ответ

0

Таким образом, проблема была InputStream, а также я пытался серализовать объекты i.e V & базы данных. Я просто добавил переходный процесс, например private transient Database database;, а затем объявил database = new Database(); в конструкторе. поэтому я смог сериализовать его.

Спасибо @ Ralf, @Joseph, @Diyarbakir и @ 3kings за то, что помогли мне.

0

Вы получаете исключение, потому что вы пытаетесь сериализовать InputStream

private InputStream imag; 

InputStream не Serializable

Вы можете пропустить это поле при сериализации объявляя его transient:

private transient InputStream imag; 
+0

Я пробовал, но все еще получаю ошибку http://pastebin.com/YwQf0izy – nix

0

Ваш объект InputStream, который не реализует Serializable. Это должно быть байтовая [] или строковая ссылка на ваше местоположение.

Отредактировано: Отделить объект от объекта модели. Переместите метод insertBook и объект базы данных из класса Book в другой класс.

+0

Я попробовал, даже удалил InputStream, но по-прежнему ту же ошибку. вы можете просмотреть ошибку stacktrace http://pastebin.com/YwQf0izy – nix

+0

Я вижу проблему. Я не знаю, зачем вам нужен объект базы данных в вашей книге, но, пожалуйста, переместите вашу логику в другой класс. 'String className = this.getClass(). GetName(); database.insertBookRecord (this.getIsbn(), this, className); ' –

+0

Я понял проблему, не сериализуя объект внутри другого объекта. Я имею в виду, если вы видите код, я объявил конструктор, чтобы он не сериализовал объект базы данных, аналогично его не сериализуя объект проверки. Если я удаляю их и помещаю внутри метод, он отлично работает, а сериализация выполняется. Но я хочу, чтобы они были в поле и конструкторе, поэтому я не декларирую их снова и снова. Можно ли не допускать сериализации? – nix