Сериализация является процессом превращения объекта в памяти в поток байтов, таким образом, можно сделать, материалу нравится, хранят его на диске или отправляют его по сети.
Десериализация является обратным процессом: превращение потока байтов в объект в памяти.
Если вы компилируете с параметром debug = line
, информация о строке существует в файле класса, но виртуальная машина может выбросить ее во время выполнения. Это зависит от некоторых параметров, которые вы можете указать при запуске программы Java. Обычно снижение производительности при работе с отладочной информацией составляет около 5% плюс немного больше памяти в пространстве perm gen. Поскольку эта информация бесценна, я не вижу причин удалять ее.
Ваш комментарий ( Util.java (встроенный скомпилированный код)
) предполагает, что вы используете агрессивные оптимизации. Если можете, выключите их. Таким образом, вы можете просто:
// For Java 1.4, use new Exception().getStackTrace()
int line = Thread.currentThread().getStackTrace()[0].getLineNumber();
, когда вам это нужно (например, внутри catch
или if (log.isInfoEnabled ())
).
Что касается __LINE __
, компилятор Java не поддерживает это. Ваш единственный вариант - использовать какие-нибудь хаки для фильтрации источника. Я предлагаю определить переменную int __LINE __
где-нибудь и установить для нее какое-нибудь случайное значение (0 достаточно случайный), когда вам это нужно. Затем напишите фильтр, который заменяет число в __ LINE__ = \ d +
на текущий номер строки. Это позволяет зафиксировать номер строки на месте.
Невозможно получить эффект __ LINE __
в C, который происходит во время компиляции.
Вы можете получить номер строки, вызвав такую функцию во время выполнения,
public static int lineNumber() {
return Thread.currentThread().getStackTrace()[2].getLineNumber();
}
Я бы использовал для этого фреймворк журналирования и позволил бы ему разбираться с беспорядочными деталями. И java.util.logging, и logback могут легко отображать информацию о вызывающем абоненте, аналогичную той, что может предоставить LINE .
Основное преимущество состоит в том, что информация вычисляется только в случае необходимости, поэтому отсутствие вывода означает отсутствие накладных расходов. .
Я не думаю, что Java предлагает то, что вам нужно.
Однако, если бы вам пришлось написать свой собственный процессор аннотаций и использовать API-интерфейсы компилятора Java 6.0 ] Думаю, вы могли бы решить эту проблему. Я бы не стал догадываться, сколько работы потребуется для этого.
Обратите внимание, что Eclipse позволяет вам включать вашу собственную обработку аннотаций в свой механизм сборки.
Я не знаю такого в Java-компиляторе. Но вы можете написать простую программу, которая заменяет токен типа __ LINE __
на номер файла в файле и настраивает процесс сборки для выполнения этого инструмента перед компиляцией. Какой-то препроцессор.
Верно, что из коробки эти макросы недоступны. Однако, используя инструменты и отладочную информацию, вы можете это реализовать. check http://www.gallot.be/?p=85