1

所以我有一个程序(这是一个简单的聊天客户端),我试图从服务器发送一个更新的客户端。为此,我使用了 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 是一个类,旨在包含一个类的原始字节数据并将其传输,以便在另一端读取。把东西放在队列上只是简单地传输它们。

我将是第一个承认我在网络方面并不出色的人,并且可序列化不是我的强项。但是,我真的可以在这里得到一些帮助。这将不胜感激。

4

1 回答 1

0

顺便说一句,我解决了这个问题。问题与内部类无关,而是与循环依赖关系(即两个类都需要定义另一个类)有关。为了删除这些,我添加了一些抽象类,依赖项中的一个类引用,另一个继承。这样,我只要先发摘要,就没有问题。

于 2012-12-14T12:03:56.437 回答