Подтвердить что ты не робот

Сериализация частных переменных в java

У меня вопрос о сериализации. Если у моего класса есть частные переменные и нет геттеров и сеттеров, то как будет оцениваться значение этих переменных с помощью API Serialization.

4b9b3361

Ответ 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

Не волнуйтесь, используя рефлексию, любой может получить доступ к вашим приватным полям.

Здесь приведен пример того, как это сделать.