Java Сериализация и передача внутренних классов

Итак, у меня есть программа (которая является простым клиентом чата), и я пытаюсь отправить с сервера обновленный клиент. Для этого я использую ключевое слово serializable. Существующий клиент может загружать и выполнять код из этого вида передачи объекта, так что это все хорошо. Моя проблема в том, что в программе есть несколько внутренних классов. Теперь, способ, которым я делаю это, состоит в том, чтобы создать массив, состоящий из всех файлов классов, необходимых для обновления, затем выполнить итерацию по нему и отправлять их по одному за раз. Моя проблема в том, что порядок их отправки влияет на исполнение. Если я сначала отправляю внутренние классы, код работает, и клиент обновляется, но выдает исключения "ClassDefNotFound" каждый раз, когда используется один из внутренних классов. В качестве альтернативы, если я отправляю внутренние классы последними, код вообще не работает и клиент не обновляется.

private static final Class[] clientUpdates = 
{EntryPanel.EnterSendListener.class, EntryPanel.ButtonSendListener.class,   
EntryPanel.class, MessagePanel.class, GUIClient.ClientThread.class, GUIClient.class,  
UpdateClientMessage.class};

Это мой массив, где что-либо с путем в это внутренний класс. Последний элемент - это тот, который запускает метод запуска нового клиента при его отправке.

for(Class c : clientUpdates)
            {
                String name = c.getName();
                InputStream is = c.getClassLoader().getResourceAsStream(
                        name.replaceAll("\\.", "/") + ".class");

                ByteArrayOutputStream os = new ByteArrayOutputStream();
                byte[] buff = new byte[1024];
                int i = is.read(buff);

                while(i != -1)
                    {
                        os.write(buff, 0, i);
                        i = is.read(buff);
                    }

                byte[] bs = os.toByteArray();

                NewMessageType m = new NewMessageType(name, bs);
                queue.put(m);
            }
            queue.put(new UpdateClientMessage("localhost", port));

Код, который я использую для отправки определений классов. NewMessageType - это класс, предназначенный для хранения необработанных байтовых данных класса и передачи их через них для чтения на другой стороне. Помещение вещей в очередь просто передает их через.

Я буду первым, кто признает, что я не очень хорош в сетевых вещах, и сериализуемость не моя сильная сторона. Тем не менее, я мог бы действительно сделать с некоторой помощью здесь. Это будет с благодарностью.

1 ответ

Решение

Я исправил это, кстати. Проблема заключалась не в внутренних классах, а в круговых зависимостях (то есть в двух классах, требующих определения другого). Чтобы удалить их, я добавил некоторые абстрактные классы, на которые ссылался один класс в зависимости, а другой наследовал. Таким образом, до тех пор, пока я сначала отправляю абстрактные, проблем не будет.

Другие вопросы по тегам