如何使用多个类的序列化来实现备份和恢复?

2024-03-29

我正在尝试序列化存储在 JTable 中的对象(名称和注释)。我希望能够将此信息保存到文件中,并且当我加载程序时,该信息应加载到 JTable 中。当我单击备份按钮时,正在创建一个文件,但没有存储任何数据。有人可以指导我正确的方向并告诉我我做错了什么吗?我的代码如下:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.CardLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class tableTest {

private JFrame frame;
private JTable table;
private JTextField notesTextField;
private JTextField nameTextField;
private List l;

public tableTest() {
    new Serial().serialize(l);
    initialize();
}


private void initialize() {
    frame = new JFrame();
    frame.setBounds(0, 0, 1080, 900);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.getContentPane().setLayout(new CardLayout(0, 0));

    final JTabbedPane tabbedPane1 = new JTabbedPane(JTabbedPane.TOP);
    tabbedPane1.setBackground(new Color(189, 183, 107));
    frame.getContentPane().add(tabbedPane1, BorderLayout.CENTER);

    final JPanel Panel = new JPanel();
    tabbedPane1.addTab("Table", null, Panel, null);
    Panel.setLayout(null);

    final JPanel Add = new JPanel();
    tabbedPane1.addTab("Add to table", null, Add, null);
    Add.setLayout(null);

    nameTextField = new JTextField();
    nameTextField.setBounds(428, 211, 308, 34);
    Add.add(nameTextField);
    nameTextField.setColumns(10);

    notesTextField = new JTextField();
    notesTextField.setColumns(10);
    notesTextField.setBounds(428, 270, 308, 34);
    Add.add(notesTextField);

    JButton btnAddToTable = new JButton("Add to table");
    btnAddToTable.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            DefaultTableModel dtm =(DefaultTableModel)table.getModel();
            dtm.addRow(new Object[] { nameTextField.getText(),
                    notesTextField.getText() });

        }
    });
    btnAddToTable.setBounds(472, 375, 103, 23);
    Add.add(btnAddToTable);

    JButton btnBackup = new JButton("Backup");
    btnBackup.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            new Serial().deSerialize();
        }
    });
    btnBackup.setBounds(613, 375, 103, 23);
    Add.add(btnBackup);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(10, 11, 1039, 733);
    Panel.add(scrollPane);

    table = new JTable();
    scrollPane.setViewportView(table);

    table.setModel(new DefaultTableModel(

    new String[] { "Names", "Notes" }, 0));
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                tableTest window = new tableTest();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
}



import java.io.Serializable;
import java.util.ArrayList;

public class List implements Serializable {


private static final long serialVersionUID = 1L;
private ArrayList<Person> pList;

public List(){

    pList = new ArrayList<Person>();
}

public void addPerson(Person p) {
    pList.add(p);

}

public ArrayList<Person> getpList() {
    return pList;
}

public void setpList(ArrayList<Person> pList) {
    this.pList = pList;
}

}



import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Serial {

private List l;

public void serialize(List l) {

    try (FileOutputStream fileOut = new FileOutputStream("address.ser")) {

        ObjectOutputStream os = new ObjectOutputStream(fileOut);

        os.writeObject(l);

        os.close();

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

}

public List deSerialize() {

    try (FileInputStream fileIn = new FileInputStream("address.ser")) {

        ObjectInputStream os = new ObjectInputStream(fileIn);

        List l;

        l = (List) os.readObject();

        os.close();



    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return l;


}
}



import java.io.Serializable;

public class Person implements Serializable {


private static final long serialVersionUID = 1L;
private String pName;

public Person(String pName){
    setpName(pName);
}

public String getpName() {
    return pName;
}

public void setpName(String pName) {
    this.pName = pName;
}


}

你似乎在做事本末倒置。 IE。,

  • 你应该连载 not 反序列化当你备份时。
  • 恢复时应执行相反的操作。
  • 通过在备份按钮的 ActionListener 中调用反序列化并在类创建代码中调用序列化,您似乎完全倒退了。
  • 编辑:此外,您正在序列化自定义类型列表的对象,但从未将表模型中的数据添加到列表中。所以 List 永远不会保存相关数据,因此你的序列化将是徒劳的。相反,要么序列化 DefaultTableModel,要么在序列化之前将模型的数据传输到 List 对象。

另外,无关但我觉得很重要的建议:

  • 您应该首先在非常简单的程序中测试复杂的新概念,一个没有 GUI 的程序,一个没有所有这些不相关和不必要的复杂性的程序。因此,摆脱 GUI 并让序列化和反序列化正常工作first,然后才使用 GUI 将其合并到更大、更复杂的程序中。
  • 你不应该使用null布局和调用setBounds(...)在您的组件上以绝对定位放置它们,因为这会导致 GUI 非常不灵活,虽然它们在一个平台上可能看起来很好,但在大多数其他平台或屏幕分辨率上看起来很糟糕,并且很难更新和维护。相反,您需要研究和学习布局管理器,然后嵌套 JPanel,每个 JPanel 使用自己的布局管理器来创建在所有操作系统上看起来都不错的令人愉悦且复杂的 GUI。
  • 您将需要重命名您的自定义列表类,以便它的名称不会与重要的名称冲突java.util.List class.

Edit
你在评论中问:

那么一旦数据输入到 JTable 中,就应该在序列化之前将其传输到列表对象吗?我该怎么做呢?

我要做的就是完全摆脱 List 类,我会将表的模型传递到我的序列化方法中,我会调用getDataVector()在我的 DefaultTableModel 对象上提取其核心,然后我将其序列化。

反序列化时,我会做相反的事情——从磁盘读取 Vector 并从中创建一个新的 DefaultTableModel 对象Vector<String>它保存表格的列标题。至于代码细节,那就由你自己去解决了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用多个类的序列化来实现备份和恢复? 的相关文章

随机推荐

  • 如何模拟 DefaultCellEditor 的“onStartCellEditing”

    CellEditorListener 有 editingStopped 和 editingCancelled 但是 我如何实现在单元格编辑会话开始时需要运行的一段代码呢 一个典型的示例可能是 当您开始编辑时 您希望 JTextField 编
  • 使用 SQL Server 2016 批量导入 Unicode

    由于我们已经迁移到 SQL Server 2016 我们现在尝试使用非 XML 格式文件和 UTF 8 编码数据文件 使用换行符 Unix LF 通过 BULK IMPORT 将 Unicode 字符导入表中 格式文件指定主机文件数据长度
  • Javafx 删除应用程序启动时的快速白屏

    使用 javafx 7 更新 60 操作系统 Windows 7 我刚刚从那里获取了 helloworldhttp docs oracle com javafx 2 get started hello world htm http docs
  • 如何在客户端使用 Java 读取 gRPC 中的元数据

    我正在使用 Java 和 Protoc 3 0 编译器 我的 proto 文件如下所述 https github com openconfig public blob master release models rpc openconfig
  • 具有多个视图的 Durandal 小部件

    我正在使用 Durandal 开发 SPA 并且我创建了一个用于显示特定页面组件的小部件 继杜兰达尔文档 http durandaljs com documentation Creating A Widget 小部件位于app widget
  • 当图像不存在时,如何使用 CSS 隐藏替代文本?

    是否可以在所有浏览器中使用 CSS 隐藏替代文本 我尝试过color transparent 它适用于除 IE 之外的所有浏览器 可以在 IE 中使用 CSS 实现吗 预先感谢您的任何帮助 怎么样使用font size 0 它在隐藏中起作用
  • 使用 javascript 永久更改 :root .css 变量(通过输入获取变量信息)

    我正在为我正在创建的这个网站开发一个想法 这个想法基本上是要求用户提供颜色输入 12345 一旦输入 用户就会提交输入 这将在所有内容中永久更改 css 变量页 这是我的代码 HTML div class adminpage backgro
  • 无法将 DrawerLayout 放在 StatusBar 下

    我有一个活动Navigation Drawer并使用ScrimInsetsFrameLayout我能够将布局放在StatusBar一切都很顺利 然后我决定更换颜色Toolbar and StatusBar with a png所有活动布局的
  • 如何将 3D 模型从 Cinema4D 导出到 Three.js?

    如果我有一个网格建模4D影院 我怎样才能将其导出three js http github com mrdoob three js3D JS 引擎 另外 导出材料也很方便colors for 多边形选择 为此 我刚刚为 Cinema4D 编写
  • 在VBA中处理错误时如何管理无错误情况? [复制]

    这个问题在这里已经有答案了 我需要使用以下命令捕获一些 VBA 错误GoTo陈述 Sub mySub On Error GoTo errorHandler Workbooks Open myWorkbook Some Code errorH
  • 更改 ggplot 中某些类别的线型?

    我有一些数据 library reshape2 library ggplot2 df data frame cat LETTERS 1 6 VAR1 runif 6 VAR2 runif 6 VAR3 runif 6 VAR4 runif
  • Bash 脚本:使用 Expect 将文件发送到 SFTP

    我必须将一些 gzip 压缩文件从本地服务器发送到 SFTP 服务器 我的服务器信息 发行商 ID Ubuntu 说明 Ubuntu 12 04 4 LTS 发布 12 04 代号 精确 创建了一个 bash 脚本 并且能够将文件发送到 s
  • 仅绘制 QPainter Path 贝塞尔曲线的部分

    我只想绘制 QPainter 曲线路径的一部分 我的路径是这样的 QPointF p 4 p 0 QPoint 100 200 p 1 QPoint 200 60 p 2 QPoint 500 180 p 3 QPoint 600 100
  • 训练鲁棒级联分类器时要考虑的建议?

    我正在训练级联分类器以检测图像中的动物 不幸的是 我的误报率相当高 使用 Haar 和 LBP 超高 使用 HOG 可以接受 我想知道如何改进我的分类器 这是我的问题 鲁棒检测所需的训练样本量是多少 我在某处读到需要 4000 个正样本和
  • R 控制台可以支持后台任务或中断(事件处理)吗?

    在 R 控制台中工作时 我想设置一个后台任务来监视特定连接 并在发生事件时执行另一个函数 警报 或者 我可以进行设置 以便外部函数仅向 R 发送警报 但这似乎是同一个问题 有必要设置一个侦听器 我可以在 R 的专用进程中执行此操作 但我不知
  • 创建对象时抛出异常

    执行catch语句时是否会创建异常对象 例如 catch ArithmeticException someObject 该对象是否不必显式创建为实例 有两件事创建异常的实例第二抛出异常 创建异常的实例例如 看起来像创建类的任何实例NullP
  • Ansible 中的角色和任务(和标签)有什么区别?

    我发现自己很困惑roles and tasks每时每刻 我知道标签是标记单个项目的一种方式 但我很困惑如何使用它们 假设我必须执行以下操作 Users Create a user named deploy Add ssh key for d
  • 如何解组嵌套的未知字段

    我分叉了一个很棒的项目here https github com sridharv reddit go blob master types go 并且刚刚把它弄得一团糟 学习了一些Go 我无法弄清楚的问题是有关自定义解组的一些事情 如果您看
  • 如何从作业中设置环境变量并在詹金斯的下一个作业中使用它?

    我想要一份设置环境变量的工作 并在接下来的所有工作中使用这些环境变量 如何通过 Jenkins 设置环境变量 从技术上讲 您无法将环境变量从一个作业传递到下一个作业 而且我不知道有一个插件可以开箱即用地执行此操作 不过有一个技巧 这个想法是
  • 如何使用多个类的序列化来实现备份和恢复?

    我正在尝试序列化存储在 JTable 中的对象 名称和注释 我希望能够将此信息保存到文件中 并且当我加载程序时 该信息应加载到 JTable 中 当我单击备份按钮时 正在创建一个文件 但没有存储任何数据 有人可以指导我正确的方向并告诉我我做