我有一个使用 agentmain 连接到远程进程的 javaagent,它通过套接字将序列化的 java 对象发送到客户端应用程序。
流的格式似乎有一个错误,我不确定这是我的 writeExternal 实现中的错误还是与 java 版本有关。我正在试验 java 1.6 32/64 位的不同组合。
基本上对象流抛出类未找到异常,但打印的包名称类似于 org.mycode.b.e.b.,b.e.b 部分与我拥有的任何包无关,我已经搜索了所有包,并且有我的代码或库中没有包含该字符串的任何内容...... b.e.b.
所以我怀疑这是由编码格式差异或 32/64 位字长问题引起的编码问题,但我在这些方面没有那么丰富的经验。
我很习惯打开调试器来跟踪代码问题,但在诊断这种性质的问题(序列化和字节格式)方面经验不足,所以我想看看推荐的调试方法是什么?
我有使用如下代码的客户端的控制/编译/源代码:
objectInput = new ObjectInput(inputStream);
Object object = objectInput.readObject();
当前抛出 class not found for the org.mycode.b.e.b.
我正在考虑重写它以将序列化流存储到文件中并查看(不确定文件在读取时实际采用什么格式),这个角度合适吗?
最佳答案
无论您使用 32 位还是 64 位,大端还是小端机器,ObjectOutputStream 的格式都不会改变。过去出现问题的地方是 Java 1.3 和 Java 1.4 使用的格式略有不同。此外,Eclipse 和 Sun 使用不同的算法来生成 serialVersionUID,因此如果您不对其进行硬编码,则可能会遇到问题。
但是,如果你有像 b.e.b 这样的包,你很可能已经混淆了你的代码,这些代码旨在使其难以使用。我建议您只调试/监控未混淆的代码。
关于java - 如何调试/查看 ObjectInputStream 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6805495/