我有一个使用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找不到的类。
我正在考虑重新编写它以将序列化的流存储到文件中并查看(不确定文件在阅读时实际上将采用什么格式),这是正确的角度吗?
答案 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。可能您必须为所有相关类定义此变量并处理其值。
但首先要避免混淆,然后再试一次。我相信一切都会奏效。祝你好运。