2016-03-30 13 views
1

Ich versuche, mein Objekt in MySQL-Datenbank mit Java-Sprache zu speichern. Ich versuche, Objekt in Byte zu konvertieren, damit ich es in LONGBLOB speichern kann. Aber ich habe einen Fehler, d. H. "NotSerializable Exception".Objekt in Datenbank in Java speichern

meine Klasse, deren Ziel Ich möchte wund:

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... 

Methode Datenbank-Methode aufrufen Objekt in der Datenbank einzufügen:

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

this ist Gegenstand der aktuellen Klasse, die ich speichern möchten .

Folgendes ist die insertBookRecord Methode.

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); 
    } 
} 

Wenn ich Aussage oos.writeObject(book); Seine erreichen stoppt mit Ausnahme und zeigt das das Paket & Klassenname in der JOptionPane.

Mein Buchobjekt enthält alle Datenfelder, die ich in die Textfelder eingegeben habe. Aber ich kann es nicht schreiben. Konvertiere es in das serialisierbare Format.

Irgendwelche Vorschläge bitte?

Stack Trace:

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

Wir müssten die 'Felder' in Ihrer' Books' Klasse sehen. Oder besser noch etwas darin ist nicht 'Serializable' – 3kings

+0

Wahrscheinlich eines oder mehrere der Felder innerhalb Ihrer Buchklasse ist nicht serialisierbar. Wo ist dein Stacktrack? – f1sh

+0

Ich habe die Felder aktualisiert. – nix

Antwort

0

Also das Problem war InputStream sowie ich versuchte, die Objekte, d. H. V & Datenbank seralisieren. Ich habe gerade Transient hinzugefügt z. B. private transient Database database; und dann database = new Database(); im Konstruktor deklariert. daher konnte ich es serialisieren.

Vielen Dank @Ralf, @Joseph, @Diyarbakir und @ 3kings für die Hilfe.

0

Sie die Ausnahme, weil Sie eine InputStream

private InputStream imag; 

InputStream serialisiert werden versuchen, ist nicht Serializable

Sie könnten dieses Feld auslassen, wenn die Serialisierung, indem er erklärt es transient:

private transient InputStream imag; 
+0

Ich habe es versucht, aber immer noch Fehler http://pastebin.com/YwQf0izy – nix

0

Ihr Bild ist InputStream, die Serializable nicht implementieren. Es sollte ein Byte [] oder eine String-Verknüpfung zu Ihrem Imag-Speicherort sein.

Bearbeitet: Sie sollten Geschäft von Modellobjekt trennen. Verschieben Sie die insertBook-Methode und das Datenbankobjekt aus der Book-Klasse in eine andere Klasse.

+0

Ich habe es versucht, sogar InputStream entfernt, aber immer noch den gleichen Fehler. Sie können den Stacktrace-Fehler anzeigen http://pastebin.com/YwQf0izy – nix

+0

Ich sehe das Problem. Ich weiß nicht, warum Sie Datenbank-Objekt in Ihrem Buch benötigen, aber bitte verschieben Sie Ihre Logik in eine andere Klasse 'String className = this.getClass(). GetName(); database.insertBookRecord (this.getIsbn(), this, Klassenname); ' –

+0

Ich erkannte das Problem, es ist kein Objekt in dem anderen Objekt serialisieren. Ich meine, wenn Sie den Code sehen, habe ich den Konstruktor so deklariert, dass er das Datenbankobjekt nicht serialisiert, ähnlich wie das Validierungsobjekt nicht serialisiert wird. Wenn ich sie entferne und die interne Methode einfüge, funktioniert es einwandfrei, d. H. Die Serialisierung ist abgeschlossen. Aber ich will sie im Feld und Konstruktor haben, also muss ich sie nicht immer wieder deklarieren. Ist es möglich, das nicht serialisieren zu lassen? – nix