Сериализация массива объектов для отправки через сокеты - PullRequest
0 голосов
/ 23 ноября 2010

У меня есть массив, который я создал из базы данных ResultSet.Я пытаюсь сериализировать его, чтобы я мог отправить его через поток сокетов.В настоящий момент я получаю сообщение об ошибке, сообщающее, что массив не сериализуем.Ниже приведен код, первая часть - это класс для создания объекта для массива:

class ProteinData
{
    private int ProteinKey;

    public ProteinData(Integer ProteinKey)
    {
        this.ProteinKey = ProteinKey;
    }

    public Integer getProteinKey() {
        return this.ProteinKey;
    }

    public void setProteinKey(Integer ProteinKey) {
         this.ProteinKey = ProteinKey;
    }
}

Код для заполнения массива:

public List<ProteinData> readJavaObject(String query, Connection con) throws Exception
    {        
        PreparedStatement stmt = con.prepareStatement(query);
        query_results = stmt.executeQuery();
        while (query_results.next())
        {
            ProteinData pro = new ProteinData();
            pro.setProteinKey(query_results.getInt("ProteinKey"));
            tableData.add(pro);
        }
        query_results.close();
        stmt.close();
        return tableData;
    }

И кодЧтобы вызвать это:

List dataList = (List) this.readJavaObject(query, con);
ObjectOutputStream output_stream = new ObjectOutputStream(socket.getOutputStream());
output_stream.writeObject(dataList);

И код, получающий это:

List dataList = (List) input_stream.readObject();

Может кто-нибудь помочь мне организовать этот массив.Все, что я могу найти на форумах - это простые массивы (EG. Int []).

Я попытался добавить сериализуемый класс и номер UID, но получил сообщение об ошибке java.lang.ClassNotFoundException: socketserver.ProteinData.Кто-нибудь сейчас почему?

Спасибо за любую помощь.

Ответы [ 3 ]

6 голосов
/ 23 ноября 2010

В основном вам нужно, чтобы классы, которые вы хотите сериализовать, реализовывали Serializable.И если вы хотите избежать предупреждения, касающегося серийного номера, у вас также должен быть long serialVersionUID для каждого из них, то есть код, используемый для определения вашей конкретной версии класса.Прочтите учебник, например , этот , чтобы получить дополнительную информацию, с сериализацией не так сложно справиться.

Однако помните, что сериализация является ошибочной при использовании между двумя разными версиями JVM (и этов целом имеет некоторые недостатки).

Просто замечание: интерфейс Serializable на самом деле не предоставляет какой-либо необходимой функции самому классу (это не типичный интерфейс) и используется только для того, чтобы различатьклассы, которые должны быть отправлены через потоки и все остальные.Конечно, если класс Serializable, все компоненты, которые он использует (переменные экземпляра), также должны быть сериализуемыми, чтобы иметь возможность отправлять весь объект.

4 голосов
/ 23 ноября 2010

Измените объявление класса на:

class ProteinData реализует Сериализуемый {...}

1 голос
/ 23 ноября 2010

Я бы подумал как минимум, что вам понадобится

, класс ProteinData реализует Serializable и

частный статический финал long serialVersionUID = 1234556L;(Затмение сгенерирует магическое число для вас).в классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...