如何将序列化对象保存到数据库中。

5
package test;

//

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

 class ssbn extends Student{
  static final String WRITE_OBJECT_SQL = "INSERT INTO java_objects(name, object_value) VALUES (?, ?)";

  static final String READ_OBJECT_SQL = "SELECT object_value FROM java_objects WHERE id = ?";

  public static Connection getConnection() throws Exception {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost/test";
    String username = "root";
    String password = "";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
  }

  public static long writeJavaObject(Connection conn, Object object) throws Exception {
    String className = object.getClass().getName();
    PreparedStatement pstmt = conn.prepareStatement(WRITE_OBJECT_SQL, Statement.RETURN_GENERATED_KEYS);

    // set input parameters
    pstmt.setString(1, className);
    pstmt.setObject(2, object);
    pstmt.executeUpdate();

    // get the generated key for the id
    ResultSet rs = pstmt.getGeneratedKeys();
    int id = -1;
    if (rs.next()) {
      id = rs.getInt(1);
    }

    rs.close();
    pstmt.close();
    System.out.println("writeJavaObject: done serializing: " + className);
    return id;
  }

  public static Object readJavaObject(Connection conn, long id) throws Exception {
    PreparedStatement pstmt = conn.prepareStatement(READ_OBJECT_SQL);
    pstmt.setLong(1, id);
    ResultSet rs = pstmt.executeQuery();
    rs.next();
    Object object = rs.getObject(1);
    String className = object.getClass().getName();

    rs.close();
    pstmt.close();
    System.out.println("readJavaObject: done de-serializing: " + className);
    return object;
  }

  public static void main(String args[])throws Exception {
    Connection conn = null;
    try {
      conn = getConnection();
      System.out.println("conn=" + conn);
      conn.setAutoCommit(false);
      List<Object> list = new ArrayList<Object>();
      list.add("This is a short string.");
      list.add(new Integer(1234));
      list.add(new Date());

//      long objectID = writeJavaObject(conn, list);
//      conn.commit();
//      System.out.println("Serialized objectID => " + objectID);
//      List listFromDatabase = (List) readJavaObject(conn, objectID);
//      System.out.println("[After De-Serialization] list=" + listFromDatabase);
      Student st = new Student("001","aaa",95);
      long objID = writeJavaObject(conn, st);
      conn.commit();
        System.out.println("SERIALIZED : " + objID);
        //class cast exception
        Student ss = (Student)readJavaObject(conn, objID);

        System.out.println("DESERIALIZED : " + ss);
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      conn.close();
    }
  }

    public ssbn(String id, String name, int marks) {
        super(id, name, marks);
    }
}

这是我的代码,类“student”包含以下三个变量: String id; String name; int marks; 我想要将“student”对象序列化并保存到代码中提到的MySQL数据库中。 但是,我一直得到一个“class cast exception”的错误,请问有谁可以帮助我? 提前感谢。


提供有关问题的全部信息可能会有帮助,例如错误消息。 - Devolus
1个回答

4

一种方法是将序列化对象作为文本存储,即将其作为表的属性存储为文本。当您检索时,它与保存时相同,即其序列化属性不会丢失。


感谢您的回复,我成功地将其序列化并在文件中使用了。 - user3363357
1
谢谢您的回复。我想要做的是将对象转换为byte[],然后将其保存到数据库中的BLOB字段下。 - user3363357

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接