所以我有一个程序(这是一个简单的聊天客户端),并且我正在尝试从服务器发送更新的客户端。为此,我使用了可序列化关键字。现有的客户端可以从这种对象传输中加载并执行代码,所以这很好。我的问题是该程序具有一些内部类。现在,我这样做的方法是创建一个由更新所需的所有类文件组成的数组,然后迭代它并一次发送一个。我的问题是它们的发送顺序会影响执行。如果我先发送内部类,则代码可以工作,并且客户端会更新,但每当使用其中一个内部类时都会抛出“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 是一个类,旨在包含类的原始字节数据并将其传输,以便在另一端读取。将事物放入队列中只是简单地传输它们。
我将是第一个承认我不擅长网络事物的人,并且可串行性也不是我的强项。不过,我确实可以在这里得到一些帮助。我们将不胜感激。
最佳答案
顺便说一句,我已经解决了这个问题。问题与内部类无关,而是与循环依赖有关(即两个类都需要另一个类的定义)。为了删除这些,我添加了一些抽象类,依赖项中的一个类引用了这些抽象类,而另一个类则继承了这些抽象类。这样我只要先发摘要就没有问题了。
关于Java序列化和传输内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573770/