Java序列化和传输内部类

时间:2012-11-26 21:51:53

标签: java class serializable

所以我有一个程序(这是一个简单的聊天客户端),我正试图从服务器发送一个更新的客户端。为此,我正在使用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 个答案:

答案 0 :(得分:0)

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