Java-сериализация

Я сомневаюсь, что наткнулся на книгу «Эффективная Java». Я извиняюсь, если это действительно простое и прямолинейное сомнение. Таким образом, в Пункте 74 — Реализуйте Serializable разумно, он говорит, что даже после реализации хорошего сокрытия информации в вашем классе с использованием закрытых полей и закрытых полей пакета он может потерять эффективность? Что бы я ни читал в прошлом, все, что делает сериализация, это преобразование объектов в форму потока байтов, и после десериализации тот же объект сохраняется обратно. Как он теряет скрытие данных в этом процессе?


person t0mcat    schedule 12.11.2010    source источник


Ответы (3)


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

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

person candiru    schedule 12.11.2010
comment
Хммм... значит ли это, что каждый раз, когда мы сериализуем объект, мы теряем гарантию того, что скрытие данных может работать не так, как мы хотели? - person t0mcat; 12.11.2010
comment
Ну, в некотором смысле да, но если вы считаете, что это может вызвать проблемы, вы всегда можете переопределить метод readObject(), самостоятельно проверить состояние и сгенерировать исключение, если оно нарушает какое-то ограничение. Что касается доступа к значениям, в большинстве практических случаев это не представляет большой проблемы. - person candiru; 12.11.2010

На проблему сокрытия данных с Сериализацией в контексте ООП указывает @candiru.

Но есть и другой аспект Сериализации.

Вы можете отправить сериализованный файл по сети, чтобы его можно было подсмотреть, и вещи, которые должны быть конфиденциальными, могут быть легко скомпрометированы.

Ниже приведено содержимое класса Bean, который я сериализовал (используя метод по умолчанию). Я мог просмотреть содержимое, открыв сериализованный файл в текстовом редакторе.

’ sr SerializationPractice1 I ageL extrat Ljava/lang/String;L nameq ~ xp
pt SidKumarq ~ x

Теперь вы можете легко найти нижеприведенные вещи, даже не зная о классе:

  1. Имя класса: SerializationPractice1
  2. Строковый атрибут с именем name имеет значение SidKumar.

Эти вещи вы можете заметить наверняка; другие детали не столь ясны. И приведенная выше информация верна.

person rai.skumar    schedule 02.02.2013

Я верю, что сериализация может раскрыть личные данные внешнему миру. И именно здесь экстернализация (использование экземпляров типа Externalizable очень кстати). Реализуя метод writeExternal(...) интерфейса Externalizable, разработчик получает полный контроль над процессом сериализации вместо того, чтобы полностью полагаться на реализацию сериализации по умолчанию во время выполнения. Ниже приведен псевдокод моей идеи (я бы проигнорировал фактические сигнатуры методов, поскольку это просто псевдокод, предназначенный для более широкой идеи):

    class SensitiveData implemets java.io.Externalizable{

       int sensitiveInteger;
       writeExternal (OutputData outputData){
          //encrypt sensitiveInteger here
          //serialize the sensitiveInteger which is now encrypted to any persistent store
          outputData.writeInt(sensitiveInteger);
          //do other processing
    }
 }

На самом деле, почему только шифрование, мы вполне можем захотеть сжать сериализованные байты в какое-то постоянное хранилище, если мы хотим в некоторых ситуациях, когда сериализуемый экземпляр является «большим».

person nawazish-stackoverflow    schedule 24.02.2015