【问题标题】:How can I debug / view ObjectInputStream data?如何调试/查看 ObjectInputStream 数据?
【发布时间】:2011-07-24 07:25:50
【问题描述】:

我有一个 javaagent 使用 agentmain 连接到远程进程,它通过套接字将序列化的 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(); 

当前为 org.mycode.b.e.b 抛出未找到的类。

我正在考虑重写它以将序列化的流存储到文件中并查看(不确定文件在读取时实际上是什么格式),这是正确的角度吗?

【问题讨论】:

  • 你可能在使用混淆技术吗?
  • 嗯,是的,我是,这很有趣,因为我从 intellij 运行客户端,它没有被混淆,但代理 jar 代码将是......完全有意义,我忘记了这种断开连接。如果是这种情况,我现在会确认。
  • @ALexR - 感谢您的提示。你是对的。我想知道我是否应该编辑/删除我的问题,以免误导人们,我的意思是你的答案和根本问题只与 ClassNotFoundExceptions 相关,并且知道什么是,不在你的类路径上,以及混淆器是否在工作。

标签: java debugging serialization 32bit-64bit deserialization


【解决方案1】:

无论您使用 32 位或 64 位还是大端或小端机器,ObjectOutputStream 的格式都不会改变。过去出现问题的地方是 Java 1.3 和 Java 1.4 之间使用略有不同的格式。此外 Eclipse 和 Sun 使用不同的算法来生成 serialVersionUID,因此如果您没有对其进行硬编码,您可能会遇到问题。

但是,如果您有像 b.e.b 这样的软件包,您很可能已经混淆了您的代码,这旨在使其难以使用。我建议你只调试/监控你的未混淆代码。

【讨论】:

    【解决方案2】:

    我还要赞扬@Peter Lawrey。

    我认为为了简化您的调试,您应该使用非混淆代码。这将至少为您提供问题所在的提示。

    此外,部分混淆的事实可能是您问题的根本原因。想想:你的对象在客户端被序列化,没有被混淆。假设您的名为 MyFirstClass 的类依赖于 MySecondClass 并相应地进行序列化。但是在服务器端,MySecondClass 被命名为 q。为什么q?这取决于混淆器。此外,每个版本的名称可能不同。因此,服务器端找不到类 MySecondClass。

    其他可能的问题是serialiVersionUID。可能您必须为所有相关类定义此变量并处理其值。

    但首先要避免混淆,然后再试一次。我相信一切都会奏效。祝你好运。

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多