Java序列化和传输内部类

Java序列化和传输内部类,java,class,serializable,Java,Class,Serializable,所以我有一个程序(这是一个简单的聊天客户端),我试图从服务器发送一个更新的客户端。为此,我使用serializable关键字。现有的客户端可以从这种对象传输中加载和执行代码,所以这一切都很好。我的问题是这个程序有几个内部类。现在,我这样做的方式是创建一个数组,由更新所需的所有类文件组成,然后遍历它并一次发送一个。我的问题是它们的发送顺序对执行有影响。如果我先发送内部类,代码会工作,客户端会更新,但在使用任何一个内部类时都会抛出“ClassDefNotFound”异常。或者,如果我最后发送内部类,

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


我将是第一个承认我不擅长社交的人,可连载性不是我的强项。不过,我真的需要一些帮助。非常感谢。

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

这些
是静态的
内部类吗?它们不是。我需要引用外部类中非静态的值。非静态内部类具有对其封闭类的隐式引用。如果您发送内部类并尝试加载它,它将没有封闭类的类定义,因此
ClassDefNotFound
这是我假设的。然而,似乎没有办法发送此消息而不以某种方式破坏它。我不相信这样一个函数在本质上是不可能的,所以我决定我还没有解决它。另外,
is.available()
不会做你认为它会做的事情。它只是告诉你有多少你可以立即阅读而不阻塞。