Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检索要在MySql中上载的序列化JFrame_Java_Database_Swing_Serialization_Jython 2.7 - Fatal编程技术网

Java 检索要在MySql中上载的序列化JFrame

Java 检索要在MySql中上载的序列化JFrame,java,database,swing,serialization,jython-2.7,Java,Database,Swing,Serialization,Jython 2.7,我在Jython中有一个对象,它扩展了Java Swing JFrame。我的目标是序列化它,以便将它保存在MySql上,查询数据库,反序列化它,并像反序列化之前一样查看JFrame(填充所有字段)。 我真的不知道从哪里开始。我无法想象序列化—保存到数据库。 我猜序列化的JFrame可以是MySql上的blob、longblob或bit类型 目前,我已经用我在java中对象序列化方面的旧的和很少的学术知识做了一个本地实验,结果很差: def saveArt(self, e): v = Ve

我在Jython中有一个对象,它扩展了Java Swing JFrame。我的目标是序列化它,以便将它保存在MySql上,查询数据库,反序列化它,并像反序列化之前一样查看JFrame(填充所有字段)。

我真的不知道从哪里开始。我无法想象序列化—保存到数据库。 我猜序列化的JFrame可以是MySql上的
blob
longblob
bit
类型

目前,我已经用我在java中对象序列化方面的旧的和很少的学术知识做了一个本地实验,结果很差:

def saveArt(self, e):
   v = Vector()
   v.add(self) # self = JFrame in question
   out = ObjectOutputStream(BufferedOutputStream(FileOutputStream("prova.dat")))
   out.writeObject(v)
   out.close()
我所做的只是将帧放入Java向量并将其保存到文件中,但出现以下错误:

Exception in thread "AWT-EventQueue-0"  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 java.util.concurrent.ConcurrentHashMap.writeObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeWriteObject(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.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.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 java.util.concurrent.ConcurrentHashMap.writeObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeWriteObject(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.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.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.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.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 javax.swing.event.EventListenerList.writeObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeWriteObject(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.defaultWriteFields(Unknown Source)
        at java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
        at javax.swing.JComponent.writeObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeWriteObject(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.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 java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.saveInternal(Unknown Source)
        at java.awt.AWTEventMulticaster.save(Unknown Source)
        at java.awt.Component.writeObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeWriteObject(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.writeArray(Unknown Source)
        at java.io.ObjectOutputStream.writeObject0(Unknown Source)
        at java.io.ObjectOutputStream.access$300(Unknown Source)
        at java.io.ObjectOutputStream$PutFieldImpl.writeFields(Unknown Source)
        at java.io.ObjectOutputStream.writeFields(Unknown Source)
        at java.util.Vector.writeObject(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at java.io.ObjectStreamClass.invokeWriteObject(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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
java.io.NotSerializableException: java.io.NotSerializableException: org.python.core.packagecache.SysPackageManager
这个实验并不重要,因为它肯定不是最终目标。只是想弄清楚我是否可以在本地序列化它。

最终目标是将其保存在MySql数据库中,并按照保存时的方式提取它

所以我需要了解三件事:

  • 如何使用Jython序列化JFrame(假设序列化是为数据库“打包”已填充JFrame的最佳方式,如果有更好的方式,请毫不犹豫地说出来)
  • 在Mysql上设置什么样的数据(假设Mysql是实现这一点的完美dbms,如果有更好的技术,请毫不犹豫地说!)以及您是否需要进行特定的查询
  • 如何对它进行反序列化,使其与我离开时完全一致(假设反序列化是检索JFrame的最佳方式)

  • 提前非常感谢您,我的救世主(如果有的话)

    首先,Java序列化在最好的时候是个坏主意。JavaSE的安全编码指南中说“不幸的是,文本不再是红色

    在这种情况下,问题更大,因为数据将只是数据库中的一个blob,Swing不能保证版本之间的序列化兼容性(甚至可能是更新?)

    这就另辟蹊径了:从stracktrace来看,问题对象是
    SysPackageManager
    ConcurrentHashMap
    本身中的某个地方,您可能不想保留它

    将系统属性
    sun.io.serialization.extendedDebugInfo
    (可能更改)设置为
    true
    将提供有关如何引用对象的更多信息


    显然
    JFrame
    太多了。有更好的方法来存储数据。

    Tom已经介绍了错误的原因以及进一步调试的可能方法

    我将尝试用java代码详细说明您提出的3个问题:

  • 如何序列化?-回答如下
  • 使用哪种数据类型创建mysql列来存储此数据?-对于mysql,我会说mediumblob可能太小,而longblob可能太大。我也使用了longtext,它可以像预期的那样工作,没有任何问题,但它的答案很长,可以解释为什么是blob而不是文本字段。也许这个答案会给我们更多的启示-
  • 如何反序列化和使用?-回答如下

  • 动议答覆: 您可以通过几个步骤实现这一点
  • 创建JFrame

  • 将java对象序列化到mysql数据库-这非常简单

    preparedStatement.setObject(jframe_object_to_save_to_database);
    pstmt.executeUpdate();
    
  • 从mysql数据库中反序列化java对象并将其转换为JFrame对象-这不是那么简单,但也不是那么复杂,我的方法将包括如下4个步骤

    3.a。只需将列值读取为字节数组
    3.b。创建从数据库获取的字节数组的ByteArrayInputStream对象
    3.c。从ByteArrayInputStream创建ObjectInputStream
    3.d。使用ObjectInputStream.readObject()方法获取反序列化对象

    下面的代码片段介绍了这些步骤

        byte[] buf = rs.getBytes(1);
        ObjectInputStream objectIn = null;
        if (buf != null)
            objectIn = new ObjectInputStream(new ByteArrayInputStream(buf));
    
        Object deSerializedObject = objectIn.readObject();
    
  • 现在,我们已经准备好使用反序列化对象(从3.d开始),您可以轻松地将其解析为JFrame对象,并根据需要使用它


  • 下面是我所拥有的完整java实现,它是一个使用mysql数据库的简单JFrame工作代码,请遵循我在代码中作为注释编写的步骤1到步骤5,并阅读我在反序列化JavaObjectFromDB方法中提到的注释

    注1:我没有jython设置,因此无法在此处提供python/jython代码段。但是我试图用纯java来回答这个问题,我认为您可以很容易地将它与jython中的需求联系起来(因为我使用的类没有变化)

    注2:我不想讨论序列化的持久性是对是错,这取决于应用程序类型、用户类型、项目类型和许多其他场景。你是最好的法官


    注3:这篇文章帮助我更好地回答了这个问题-

    不要这样做。而是保存字段值。这不是我想要的,所讨论的JFrame太复杂,无法逐个字段保存。您可以编写一些代码,自动查找所有字段并提取其值。你也可以使用属性来识别字段。是的,如果我不能保存整个帧,这是个好主意,但我会认真尝试避免它…我会等待悬赏结束,我相信我会遵循经典方法。将表和嵌套表保存为json作为mysql字段如何?
    Jframe deSerializedObject = (JFrame) objectIn.readObject();
    
    import java.awt.FlowLayout;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Properties;
    import java.util.Vector;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class SerializeToDatabase {
    
        private static final String SQL_CREATE_TABLE = "create table if not exists serialized_java_objects (object_name varchar(1000), serialized_object blob)";
        private static final String SQL_SERIALIZE_OBJECT = "INSERT INTO serialized_java_objects(object_name, serialized_object) VALUES (?, ?)";
        private static final String SQL_DESERIALIZE_OBJECT = "SELECT serialized_object FROM serialized_java_objects limit 1";
    
        public static void createTable(Connection connection) throws SQLException {
            connection.createStatement().executeUpdate(SQL_CREATE_TABLE);
        }
        
        public static void serializeJavaObjectToDB(Connection connection,
                Object objectToSerialize) throws SQLException {
    
            PreparedStatement pstmt = connection
                    .prepareStatement(SQL_SERIALIZE_OBJECT);
    
            // just setting the class name
            pstmt.setString(1, objectToSerialize.getClass().getName());
            pstmt.setObject(2, objectToSerialize);
            pstmt.executeUpdate();
            pstmt.close();
            
            System.out.println("Java object serialized to database. Object: " + objectToSerialize);
    
        }
    
        /**
         * To de-serialize a java object from database
         *
         * @throws SQLException
         * @throws IOException
         * @throws ClassNotFoundException
         */
        public static Object deSerializeJavaObjectFromDB(Connection connection) throws SQLException, IOException,
                ClassNotFoundException {
            PreparedStatement pstmt = connection.prepareStatement(SQL_DESERIALIZE_OBJECT);
            ResultSet rs = pstmt.executeQuery();
            rs.next();
    
            //NOTE - below is the most basic way of retrieving data from result set, works perfect for general data 
            //Object object = rs.getObject(1);
    
            //NOTE - below is the way how we need to implement to retrieve serialized objects from resultset
            byte[] buf = rs.getBytes(1);
            ObjectInputStream objectIn = null;
            if (buf != null)
                objectIn = new ObjectInputStream(new ByteArrayInputStream(buf));
    
            Object deSerializedObject = objectIn.readObject();
    
            rs.close();
            pstmt.close();
    
            System.out.println("Java object de-serialized from database. Object: "
                    + deSerializedObject + " Classname: "
                    + deSerializedObject.getClass().getName());
            
            return deSerializedObject;
        }
    
        public static Connection getMySqlConnection(String ipAddr, String portNumber, String db, String userName, String password) throws SQLException {
            
            Connection mysqlConn = null;
            
            Properties properties = new Properties();
            properties.put("user", userName);
            properties.put("password", password);
            
            mysqlConn = DriverManager.getConnection("jdbc:mysql://"+ipAddr+":"+portNumber+"/"+db, properties);
            return mysqlConn;
        }
        
        /**
         * Serialization and de-serialization of java object from mysql
         *
         * @throws ClassNotFoundException
         * @throws SQLException
         * @throws IOException
         */
        public static void main(String args[]) throws ClassNotFoundException,
                SQLException, IOException {
        
            //step 1 - create mysql connection
            Connection connection = getMySqlConnection("192.168.1.119", "3306", "xxx", "xxx", "xxx");
    
            //step 2 - create JFrame
            JFrame frame = new JFrame("JFrame Example");  
            JPanel panel = new JPanel();  
            panel.setLayout(new FlowLayout());  
            JLabel label = new JLabel("JFrame By Example");  
            JButton button = new JButton();  
            button.setText("Button");  
            panel.add(label);  
            panel.add(button);  
            frame.add(panel);  
            frame.setSize(200, 300);  
            frame.setLocationRelativeTo(null);  
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //uncomment below line if you want to see the JFrame before persisting data
            //frame.setVisible(true);
    
            //step 3 - create table
            createTable(connection);
            
            //step 4 - serializing java object to mysql database
            serializeJavaObjectToDB(connection, frame);
    
            //step 5 - de-serializing java object from mysql database and converting it into JFrame object
            JFrame objFromDatabase = (JFrame) deSerializeJavaObjectFromDB(connection);
            //setVisible(true) will show the JFrame as is, what ever we have persisted
            objFromDatabase.setVisible(true);
            
            //finally close the connection
            connection.close();
        }
    }