Почему сериализация Java реализует Serializable

Java

(Этот контент является моим личным восприятием после сбора некоторой информации. Если у вас есть какие-либо вопросы, пожалуйста, укажите. Краб Краб)

задний план

Для Serializable все знают, что это один из java接口. Используется для обозначения сериализуемого или нет, в этом интерфейсе ничего нет. Большая часть Интернета просто говорит нам, что с помощью этого интерфейса можно сериализовать объекты, что может облегчить存储和传输. Если этот интерфейс не реализован, во время сериализации будет выдано исключение.

сомневаться

После прочтения у многих учащихся могут возникнуть вопросы:

Пустой интерфейс, в котором ничего нет. Почему Java должен реализовывать Serializable для сериализации? Могу ли я удалить интерфейс Serializable и сделать каждый объект сериализуемым?

отвечать

Автор просмотрел ответы в Интернете, хотя в большинстве из них объяснялась роль Serializable, и не говорилось почему. Но в итоге было найдено более убедительное объяснение.

В общем, это вопрос безопасности, см. пояснение по конкретным причинам: если нет интерфейса (то есть нет Serializable, чтобы отметить, можно ли его сериализовать), все объекты могут быть сериализованы. Затем, после того, как все объекты будут сериализованы и сохранены на жестком диске, вы сможете увидеть значение, соответствующее атрибуту в сериализованном файле (позже будет показано в коде). Итак, в конце концов, в целях безопасности (то есть для предотвращения раскрытия значений частных свойств в некоторых объектах) все объекты не могут быть сериализованы. Чтобы позволить пользователю выбирать, может ли он быть сериализован или нет, необходим интерфейс, чтобы отметить, может ли класс сериализоваться или нет.

Доказывать

Сначала мы создаемpersonКласс, этот класс имеет три атрибута: возраст (я хочу рассказать другим), имя (я хочу рассказать другим) и секрет (я не хочу рассказывать другим). Конкретный код выглядит следующим образом.

public class Person implements Serializable {

    private int age;
    private String name;
    //我的秘密
    private String secret;

    public Person(int age, String name, String secret) {
        this.age = age;
        this.name = name;
        this.secret = secret;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person() {
    }
}

Затем мы сериализуем объект Person на жесткий диск.

public class Main {
    public static void main(String[] args) {
        /**
         * person对象有三个属性,
         * 一个是我的年纪(可以让别人知道)
         * 一个是我的名字(可以让别人知道)
         * 一个是我的秘密(我不想告诉别人)
         */
        Person person = new Person(22, "小明", "我喜欢畅畅");
        // 把对象存入硬盘
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person"));){
            oos.writeObject(person);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

После выполнения этого кода в каталоге проекта будет найден файл пользователя. Затем вы обнаружите, что значения некоторых объектов на самом деле находятся в открытом тексте. Например我喜欢畅畅Это моя секретная утка.

Все, если любой объект можно сериализовать, то некоторые частные свойства объекта могут быть получены вредоносным кодом. Поэтому в целях безопасности java-дизайнеры не разрешают сериализовать все объекты, а требуют от пользователей указывать классы, которые можно сериализовать, при написании кода.


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

Вы можете использовать статические или переходные параметры для изменения переменных, как вы их используете? пожалуйста, переместитеблог одноклассника happyjava. Спасибо за чтение.Вышеизложенное является моим личным мнением.Если у вас есть еще мнения, пожалуйста, прокомментируйте и поделитесь.