java - 如何调试/查看 ObjectInputStream 数据?

标签 java debugging serialization 32bit-64bit deserialization

我有一个使用 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/

相关文章:

java - 无法使用 Intellij Idea community 12.1.4 和 maven 3.0.5 下载源代码

java - TimePicker 在获取分钟和小时时导致应用程序崩溃

java - 如何播放 MP3 文件?

java - 序列化 FacesContext 或如何在服务器重新启动后获取属性值

c# - 如何在 XML 中序列化对象,同时展平属性的内部层次结构

java - 将动态 Javascript 树结构加载到 JSP 中

c++ - 查找抛出 std::out_of_range 的对象

c++ - 使用 SetUnhandledExceptionFilter() 为访问冲突异常创建小型转储

debugging - 您曾在其中工作过的最具挑战性的开发环境是什么?您如何克服这些限制?

c# - 要说自定义异常是可序列化的,最低要求是什么?