Java序列化和传输内部类

标签 java class 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 是一个类,旨在包含类的原始字节数据并将其传输,以便在另一端读取。将事物放入队列中只是简单地传输它们。

我将是第一个承认我不擅长网络事物的人,并且可串行性也不是我的强项。不过,我确实可以在这里得到一些帮助。我们将不胜感激。

最佳答案

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

关于Java序列化和传输内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573770/

相关文章:

java - GWT 对象序列化

java - 嵌套基类出现莫名其妙的 Netbeans 可序列化警告

java - 在 GAE 上使用 Siena 时如何编写单元测试

java - 将 java 属性传递给 javascript 函数数组参数

java - 如何在 JPQL 中使用别名

python - 这个全局类变量如何兼容 pep8 并且仍然有效?

C++子类访问主类变量

java - Mvel的编译表达式如何存储在数据库中

java - 用于捕获以逗号分隔的组排序的正则表达式

java - 保存从基类派生的实例