Как я могу отладить / просмотреть данные ObjectInputStream? - PullRequest
2 голосов
/ 24 июля 2011

Я подключил javaagent к удаленному процессу, используя agentmain, который отправляет сериализованные объекты 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.beb

Я думал переписать его, чтобы сохранить сериализованный поток в файл, и посмотреть (нетне уверен, в каком формате файл будет читаться), это правильный угол?

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Формат для ObjectOutputStream не изменяется независимо от того, используете ли вы 32-разрядную или 64-разрядную версию, либо машину с прямым или прямым порядком байтов. В прошлом были проблемы между Java 1.3 и Java 1.4, использующими немного разные форматы. Кроме того, Eclipse и Sun использовали разные алгоритмы для генерации serialVersionUID, чтобы вы могли столкнуться с проблемами, если не усердно его кодировали.

Однако, если у вас есть пакеты, такие как b.e.b, вы, скорее всего, запутали свой код, который разработан так, чтобы с ним было трудно работать. Я предлагаю вам только отладить / проконтролировать ваш необфусцированный код.

0 голосов
/ 24 июля 2011

Я дополнение к похвале @Peter Lawrey.

Я думаю, что для упрощения отладки вы должны работать с неясным кодом.Это даст вам хотя бы подсказку, в чем проблема.

Более того, вероятно, факт частичной запутывания является основной причиной вашей проблемы.Подумайте: ваш объект сериализуется на стороне клиента, который не запутан.Допустим, ваш класс с именем MyFirstClass зависит от MySecondClass и соответствующим образом сериализуется.Но на стороне сервера MySecondClass называется q.Почему д?Это до обфускатора.Более того, это имя может отличаться для каждой сборки.Таким образом, серверная сторона не может найти класс MySecondClass.

Другая возможная проблема - serialiVersionUID.Вероятно, вы должны определить эту переменную для всех соответствующих классов и обработать ее значение.

Но сначала просто избегайте запутывания и попробуйте снова.Я верю, что все будет работать.Удачи.

...