当前位置: 首页 > 知识库问答 >
问题:

给出空对象引用的Java序列化/反序列化

酆高翰
2023-03-14

我正在做一个小组项目,我们遇到了一个软件序列化部分的问题。我们有类协议:



    import java.io.Serializable;

    import javax.swing.table.TableModel;

    public class Protocol implements Serializable{


        private static final long serialVersionUID = 3474882407641871963L;
        private int state;//0 = logged out 
        //1=logged in waiting for search 
        //2= search query sent
        private String output;
        private TableModel searchResults;

        public Protocol(int state){
            this.output = "";
            this.state = 0;
            this.searchResults = null;
        }

        public void setState(int s) {
            this.state = s;
        }

        public void setOutput(String o) {
            this.output = o;
        }

        public void setSearchResults(TableModel results) {
            this.searchResults = results;
        }

        public String getOutput() {
            return this.output;
        }

        public int getState(){
            return this.state;
        }
        public TableModel getSearchResults(){
            return this.searchResults;
        }


    }

我们还有SearchResult类:


    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;

    import javax.swing.event.TableModelListener;
    import javax.swing.table.TableModel;

    /**
     * An implementation of the TableModel interface that utilises a List of DataRow objects to
     * store the data.
     * 
     * @version 13/03/2014
     * @author Jake Darby
     * 
     * @see DataRow
     * @see TableModel
     */
    public class SearchResult implements TableModel 
    {
        private final List DATA;
        private static final int NUM_COLUMNS = 8;
        private final int NUM_ROWS;

        /**
         * Constructor that generates a SearchResult object from a set of Results of a query to the 'products' table
         * 
         * @param data The results of an SQL query of the 'products' table
         * @throws SQLException
         * 
         * @see ResultSet
         */
        public SearchResult (ResultSet data) throws SQLException
        {
            super();
            DATA = DataRow.generate(data);
            NUM_ROWS = DATA.size();
        }

        /**
         * Constructor creates an empty TableModel
         */
        public SearchResult()
        {
            super();
            DATA = new ArrayList();
            NUM_ROWS = 0;
        }

        @Override
        public int getRowCount() 
        {
            return NUM_ROWS;
        }

        @Override
        public int getColumnCount() 
        {
            return NUM_COLUMNS;
        }

        @Override
        public String getColumnName(int columnIndex) 
        {
            switch(columnIndex)
            {
            case 0:
                return "ID";
            case 1:
                return "Name";
            case 2:
                return "Price";
            case 3:
                return "Pack Quantity";
            case 4:
                return "Quantity in Stock";
            case 5:
                return "VAT";
            case 6:
                return "Order Date";
            case 7:
                return "Expiry Date";
            default:
                return null;
            }
        }

        @Override
        public Class getColumnClass(int columnIndex) 
        {
            switch(columnIndex)
            {
            case 0:
            case 3:
            case 4:
                return Integer.class;
            case 1:
            case 2:
            case 6:
            case 7:
                return String.class;
            case 5:
                return Boolean.class;
            default:
                return null;
            }
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) 
        {
            return false;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) 
        {
            DataRow row = DATA.get(rowIndex);
            switch(columnIndex)
            {
            case -1:
                return row.getPrice();
            case 0:
                return row.getID();
            case 1:
                return row.getName();
            case 2:
                return String.format("£%d.%02d", row.getPrice()/100, row.getPrice()%100);
            case 3:
                return row.getPackQuantity();
            case 4:
                return row.getQuantity();
            case 5:
                return row.getVAT();
            case 6:
                return row.getOrderDate() == null ? "N/A" : row.getOrderDate();
            case 7:
                return row.getExpiryDate() == null ? "N/A" : row.getExpiryDate();
            default:
                return null;
            }
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) 
        {/*No implementation*/}
        @Override
        public void addTableModelListener(TableModelListener l) 
        {/*No implementation*/}

        @Override
        public void removeTableModelListener(TableModelListener l) 
        {/*No implementation*/}

        @Override
        public String toString()
        {
            String result = "";
            for (int i = 0; i 

当我们通过客户端-html" target="_blank">服务器套接字连接编写协议类时,就会出现问题。问题是Protocol类中的TableModel对象在序列化/反序列化过程中的某个时刻变为null,而我们所做的任何事情都还没有解决这个问题。

到目前为止,我们已尝试:

-在SearchResult中实现Serializable(由于TableModel实现了Serializable,我不认为它应该是必要的)

-将Protocol中的TableModel字段变量更改为SearchResult字段变量

如有任何帮助,我们将不胜感激。

共有1个答案

武睿
2023-03-14

此代码正确地序列化和反序列化对象:

//write out the object
FileOutputStream fos = new FileOutputStream("out.myobj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Protocol p = new Protocol(4);
p.setState(5);
oos.writeObject(p);
oos.close();

//read it in
FileInputStream fis = new FileInputStream("out.myobj");
ObjectInputStream ois = new ObjectInputStream(fis);
Protocol x = (Protocol)ois.readObject();
ois.close();
System.out.println(x.getState());

输出:

5

在本例中,这与如何将对象写入流有关。

注意:TableModel是一个不实现Serializable的接口。实现Serializable在这里只对协议是必要的。如果您写出了实现TableModel的类,那么这个类也需要实现Serializable。

请参阅文档:

http://docs.oracle.com/javase/7/docs/api/javax/swing/table/tablemodel.html

 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 错误: java.lang.ClassNotFoundException:testprocedure.tp$3在java.net.URLClassLoader$1上运行(未知源)在java.net.URLClassLoader上运行(未知源)在java.security.accessController.doprivileged(本机方法)在java.net.URLClassLoader.find

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列

  • 我试图序列化一个对象数组,并将其写入一个名为address.ser的文件,然后从该文件中读取,反序列化对象数组并显示其属性。我尝试一次序列化整个arrayList(读取时在单个会话中反序列化它),也尝试一个接一个地序列化对象数组的每个对象(读取时一个接一个地反序列化它)。问题是,当从address.ser文件读回来时,我只得到最后一个被写入的对象的数据,而不是其他的。 以下是代码片段: 这是用于将

  • 上下文:我们使用Activiti作为流程引擎,使用Activiti-Rest作为应用程序的接口。由于这个问题与返回由Java序列化的对象的REST服务有关,所以我没有将其添加到标题中。 场景:我们有一个JBoss Wildfly实例,它包含一个EAR和一个包含类“ProcessContext”的模块(为了参考,我们将其称为X)。Activiti在这个EAR中运行,ServiceTasks(从进程中