如何调试/查看ObjectInputStream数据?

时间:2011-07-24 07:25:51

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

我有一个使用agentmain连接到远程进程的javaagent,它通过socket将序列化的java对象发送到客户端应用程序。

在流的格式化中似乎存在一个错误,我不确定它是否是我的writeExternal实现中的错误,或者它是否与java版本有关。我正在尝试java 1.6 32/64位的不同组合。

基本上,对象流抛出了一个未找到类的异常,但是打印的包名是类似org.mycode.beb,beb部分与我拥有的任何包无关,我已经遍布搜索了所有我的代码或库中没有任何字符串... beb

所以我怀疑这是由编码格式差异或32/64位字长问题引起的编码问题,但我不是在这些方面经验丰富。

我已经习惯于打开调试器来跟踪代码问题,但是经验不足,诊断出这种性质的问题,使用序列化和字节格式,所以我想看看有哪些推荐的调试方法?

我有使用代码的客户端的控制/编译/来源:

objectInput = new ObjectInput(inputStream);
Object object = objectInput.readObject(); 

当前抛出了org.mycode.b.e.b找不到的类。

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

2 个答案:

答案 0 :(得分:2)

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

但是,如果您有像b.e.b这样的软件包,那么您很可能会对代码进行模糊处理,而这些代码的设计难以使用。我建议您只调试/监控未混淆的代码。

答案 1 :(得分:0)

我除了@Peter Lawrey的表扬。

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

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

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

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