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