У меня вопрос о сериализации. Если у моего класса есть частные переменные и нет геттеров и сеттеров, то как будет оцениваться значение этих переменных с помощью API Serialization.
Сериализация частных переменных в java
Ответ 1
API Serialization не беспокоится о частных переменных. Его целью является преобразование вашего объекта в двоичное представление в файл или какой-либо другой вид хранилища, который может быть реконструирован позже.
Здесь объясняется алгоритм сериализации Java.
Ответ 2
Во-первых, разрешения доступа - это функция времени компиляции. доступ не контролируется во время выполнения.
Это может вас смутить, но постарайтесь сделать следующее: создайте 2 версии класса A:
1
public class A {
public foo() {
System.out.println("hello");
}
}
2
public class A {
private foo() {
System.out.println("hello");
}
}
Теперь напишите класс, который вызывает новый A(). foo() и скомпилирует его с первой версией класса A. Затем поместите вторую версию в путь к классам и запустите приложение. Он будет работать!
Итак, не беспокойтесь о разрешениях доступа: их всегда можно обойти.
Если, например, вы используете отражение для вызова частного метода foo()
, вам нужно получить метод, а затем вызвать setAccessible(true)
:
Method m = A.class.getMethod("foo",
null); m.setAccessible(true);
m.invoke(new A(), null);
Если мы можем получить доступ к приватным методам из нашего кода, убедитесь, что классы JDK могут это сделать, даже если они написаны в java. Кстати, насколько я знаю, стандартная сериализация Java реализована как собственный код.
Ответ 3
Механизм сериализации по умолчанию не заботится о области доступа переменных-членов. Другими словами, общедоступные, защищенные, пакетные и частные переменные обрабатываются одинаково. Детали реализации могут отличаться, но, как я помню, Sun JRE делает это, реализуя большую часть сериализации в коде native (JNI), где права доступа не применяются.
Ответ 4
Не волнуйтесь, используя рефлексию, любой может получить доступ к вашим приватным полям.
Здесь приведен пример того, как это сделать.