Работа с файлами.
Виталий Унгурян
unguryan@itstep.org
Класс File
File — единственный класс в java.io,
который работает непосредственно с
дисковыми файлами.
Его задачей является управление
информацией о файлах и каталогах.
Класс File
Хотя на уровне операционной
системы файлы и каталоги
отличаются, но в Java они
описываются одним классом File.
Класс File
boolean createNewFile():
создает новый файл по пути, который
передан в конструктор. В случае
удачного создания возвращает true,
иначе false
boolean delete():
удаляет каталог или файл по пути,
который передан в конструктор. При
удачном удалении возвращает true.
Класс File
String getAbsolutePath():
возвращает абсолютный путь для пути,
переданного в конструктор объекта
String getName():
возвращает краткое имя файла или
каталога
String getParent():
возвращает имя родительского каталога
Класс File
boolean isDirectory(): возвращает
значение true, если по указанному пути
располагается каталог
boolean isFile(): возвращает значение
true, если по указанному пути находится
файл
boolean isHidden(): возвращает значение
true, если каталог или файл являются
скрытыми
Класс File
long length():
возвращает размер файла в байтах
long lastModified():
возвращает время последнего
изменения файла или каталога.
Значение представляет количество
миллисекунд, прошедших с начала
эпохи Unix
Класс File
String[] list():
возвращает массив файлов и
подкаталогов, которые находятся в
определенном каталоге
File[] listFiles():
возвращает массив файлов и
подкаталогов, которые находятся в
определенном каталоге
Класс File
boolean mkdir():
создает новый каталог и при удачном
создании возвращает значение true
boolean renameTo(File dest):
переименовывает файл или каталог
Интерфейс FilenameFilter
Объекту, чтобы реализовать этот
интерфейс, требуется определить
только один метод — accept(), который
будет вызываться один раз с каждым
новым именем файла.
Метод accept должен возвращать true
для тех имён, которые надо включать в
список, и false для имён, которые
следует исключить.
ввод/вывод
Обобщённое понятие источника
ввода относится к различным
способам получения
информации: к чтению
дискового файла, символов с
клавиатуры либо получению
данных из сети.
ввод/вывод
Под обобщённым понятием вывода
также могут пониматься дисковые
файлы, сетевое соединение и т. п.
Эти абстракции дают удобную
возможность для работы с вводом-
выводом (I/O), не требуя при этом, чтобы
каждая часть вашего кода понимала
разницу между, скажем, клавиатурой и
сетью.
ввод/вывод
В Java абстракция ввода/вывода
называется потоком (stream) и
реализована в нескольких
классах пакета java.io.
ввод/вывод
Ввод данных инкапсулирован в
абстрактном классе InputStream,
Вывод данных — в
OutputStream.
По течению грести легче
Потоки ввода/вывода в Java
предоставляют программисту ясную
абстракцию для выполнения
сложных и зачастую громоздких
операций ввода - вывода данных.
По течению грести легче
Java - программы, опирающиеся на
абстракции высокого уровня -
классы InputStream и OutputStream,
будут и в будущем функционировать
правильно - даже тогда, когда будут
изобретены новые улучшенные
реализации классов ввода - вывода.
Класс OutputStream
OutputStream — абстрактный класс.
Задаёт модель выходных потоков
Java. Все методы этого класса
имеют тип void и возбуждают
исключение IOException в случае
ошибки.
Класс InputStream
InputStream — абстрактный класс,
задающий используемую в Java
модель входных потоков. Все
методы этого класса при
возникновении ошибки возбуждают
исключение IOException.
Файловый поток FileOutputStream
FileOutputStream — простейший класс
для потокового (последовательного)
вывода байтов в файл.
Объект этого класса создается на
основе объекта File или по имени файла
в файловой системе. Создавать
объекты этого класса можно независимо
от того, существует файл или нет.
Файловый поток FilelnputStream
FilelnputStream - простейший класс
для потокового (последовательного)
чтения байтов из файла.
Объект этого класса создаётся на
основе объекта File или по имени
файла в файловой системе.
DataInputStream
DataInputStream - класс для
потокового (последовательного)
чтения данных стандартных
типов из файла.
Объект этого класса создается
на основе объекта InputStream
Фильтруемые потоки
Все конструкторы и методы,
имеющиеся в этом классе,
идентичны тем, которые есть в
классах InputStream и OutputStream,
единственное отличие классов
фильтруемых потоков в том, что их
методы синхронизированы.
Буферизованные потоки
При не буферизованном вводе-выводе
каждое чтение, или запрос записи
обрабатывается непосредственно
базовым ОС. Это может сделать
программу намного менее эффективной,
так как каждый такой запрос часто
инициировал доступ к диску, сетевое
действие, или некоторую другую работу,
которая относительно дорога.
Буферизованные Потоки
Чтобы уменьшить этот вид издержек,
платформа Java реализует
буферизованные потоки ввода-вывода.
Буферизованные входные потоковые
данные чтения от области памяти,
известной как буфер; собственный
входной API вызывают только, когда
буфер пуст.
Буферизованные Потоки
Точно так же буферизованные потоки
вывода пишут данные в буфер, и
собственный выходной API вызывают
только, когда буфер полон.
Буферизованные потоки являются
расширением классов фильтруемых
потоков
Классы BufferedInputStream и
BufferedOutputStream
Классы BufferedInputStream и
BufferedOutputStream используют
буферизованный ввод-вывод,
поэтому работают более
эффективно, чем, например,
FileInputStream и FileOutputStream.
Классы BufferedReader и BufferedWriter
Используются для
буферизованного ввода-вывода
данных, поэтому их использование
более эффективно, чем, например,
FileReader и FileWriter.
Создаются на основе объектов
Reader и Writer
Класс RandomAccessFile
RandomAccessFile - класс для
произвольного доступа,
используется как для чтения,
так и для записи. Объект этого
класса cоздается на основе
объекта File или по имени
файла в файловой системе.
Классы PipedInputStream и PipedOutputStream
Классы для канальных потоков
ввода-вывода. Хорошо подходят
для обмена информацией между
процессами.
Канальные потоки
Канальные потоки (piped streams),
определяемые классами семейства
Piped — используются в виде пар
ввода-вывода (записи-чтения);
данные, переданные в поток вывода
(записи), служат источником для
потока ввода (чтения).
Канальные потоки
С каналом (pipe) связан внутренний
буфер, ёмкость которого
определяется при реализации класса,
что позволяет поддерживать разные
уровни производительности
процессов вывода и ввода; однако
средств динамического управления
размером буфера не существует.
Класс ByteArraylnputStream
ByteArrayInputStream - это реализация
входного потока, в котором в качестве
источника используется массив типа
byte.
У этого класса два конструктора,
каждый из которых в качестве первого
параметра требует байтовый массив.
Класс ByteArrayOutputStream
ByteArrayOutputStream — два
конструктора. Первая форма
конструктора создаёт буфер размером
32 байта. При использовании второй
формы создаётся буфер с размером,
заданным параметром конструктора.
Класс PushbacklnputStream
Одно из необычных применений
буферизации — реализация операции
pushback (вернуть назад). Pushback
применяется к InputStream для того,
чтобы после прочтения символа
вернуть его обратно во входной поток.
Класс SequencelnputStream
Класс SequencelnputStream
поддерживает возможность
слияния нескольких входных
потоков в один.
В конструкторе класса SequenceInputStream в
качестве параметра используется либо два
объекта InputStream, либо перечисление,
содержащее коллекцию объектов InputStream
Класс PrintStream
Класс PrintStream предоставляет все те
утилиты форматирования, которые мы
использовали в примерах для вывода
через файловые дескрипторы пакета
System с самого начала.
Символьные потоки
Символьные потоки имеют два
основных абстрактных класса
Reader и Writer, управляющие
потоками символов Unicode.
Символьные потоки
BufferedReader - буферизированный
входной символьный поток, увеличивает
производительность за счёт
буферизации ввода.
CharArrayReader - входной поток,
который читает из символьного массива
Символьные потоки
FileReader - входной поток, читающий
текстовый файл.
FilterReader - фильтрующий читатель.
InputStreamReader - входной поток,
транслирующий байты в символы.
LineNumberReader - входной поток,
подсчитывающий строки
Символьные потоки
PipedReader - входной канал
PushbackReader - входной поток,
позволяющий возвращать символы
обратно в поток.
StringReader - входной поток, читающий
из строки.
Сериализация объектов
Сериализация - это процесс
сохранения состояния объекта в
последовательность байт.
Десериализация - это процесс
восстановления объекта, из байтового
состояния.
Зачем сериализация нужна?
В сегодняшнем мире типичное
промышленное приложение будет
иметь множество компонентов
и будет
распространено
через различные
системы и сети.
Зачем сериализация нужна?
В Java всё представлено в виде
объектов!
Если двум компонентам Java
необходимо общаться друг с другом, то
им необходим механизм для обмена
данными.
Зачем сериализация нужна?
Первый способ это разработать
собственный протокол и передать
объект.
Это означает, что получатель должен
знать протокол, используемый
отправителем для воссоздания
объекта, что усложняет разработку
сторонних компонентов.
Зачем сериализация нужна?
Следовательно, должен быть
универсальный и эффективный
протокол передачи объектов между
компонентами.
Сериализация создана для этого, и
компоненты Java используют этот
протокол для передачи объектов.
Первый способ сериализации
Класс сериализуемого объекта должен
реализовывать интерфейс
import java.io.Serializable;
class TestSerial implements Serializable {
}
Интерфейс Serializable это интерфейс-маркер; в
нём не задекларировано ни одного метода. Но
говорит сериализующему механизму, что класс
может быть сериализован.
Алгоритм сериализации Java
запись метаданных о классе
ассоциированном с объектом
рекурсивная запись описания
суперклассов, до тех пор пока не будет
достигнут java.lang.object
Алгоритм сериализации Java
после окончания записи метаданных
начинается запись фактических
данных ассоциированных с
экземпляром, только в этот раз
начинается запись с самого верхнего
суперкласса
рекурсивная запись данных
ассоциированных с экземпляром
начиная с самого низшего суперкласса
Алгоритм сериализации Java
Сохранение объекта выполняется при
помощи класса
java.io.ObjectOutputStream.
Который является фильтрующим
потоком (filter stream) - он окружает
низкоуровневый поток байтов
(называемый узловым потоком (node
stream)) и предоставляет нам поток
сериализации.
Не сериализуемые объекты
Сохраняться могут лишь объекты,
помеченные как Serializable. Класс
java.lang.Object не реализует этот
интерфейс, поэтому не все объекты
Java могут быть автоматически
сохранены.
Часть классов, включая AWT,
компоненты Swing GUI, строки и
массивы - сериализуемые.
Реализация сериализации
Используя встроенную возможность
механизма сериализации, можно
реализовать нормальный процесс
поместив в свои класс два метода:
private void writeObject(ObjectOutputStream
out) throws IOException;
private void readObject(ObjectInputStream
in) throws IOException,
ClassNotFoundException;
Остановите сериализацию!
Что если вы создали класс, чей
суперкласс сериализуемый, но при этом
вы не хотите чтобы ваш класс был
сериализуемым?
Вы не можете "разреализовать"
интерфейс, поэтому если суперкласс
реализует Serializable, то и созданный
вами новый класс также будет его
реализовать.
Остановите сериализацию!
Чтобы остановить автоматическую
сериализацию вы можете снова
применить private методы для создания
исключительной ситуации
NotSerializableException.
Создание своего собственного
протокола: интерфейс Externalizable
Вместо реализации интерфейса
Serializable, вы можете реализовать
интерфейс Externalizable, который
содержит два метода:
public void writeExternal(ObjectOutput out)
throws IOException;
public void readExternal(ObjectInput in) throws
IOException, ClassNotFoundException;
Кэширование объектов в потоке
По умолчанию, ObjectOutputStream
сохраняет ссылки на объекты, которые
в него записываются. Это означает,
что если состояние записываемого
объекта, который уже был записан,
будет записано снова, новое
состояние не сохраняется!
Граф сериализации
При сериализации связанных объектов
имеет место граф сериализации.
Граф сериализации
Сериализуется объект, если он
содержит ссылки или массивы ссылок
на сериализуемые объекты, то они
сериализуются рекурсивно. При этом
сериализуемые объекты помечаются,
что исключает зацикливание при
обходе графа.
Граф сериализации
Кроме того, для сериализуемых объектов
создаются уникальные идентификаторы,
которые необходимы для восстановления
ссылок при десериализации. Т.е. при первой
сериализации объект передаётся «по
полной программе» и для него создаётся
внутренний идентификатор, если алгоритм
повторно «натыкается» на помеченный
объект, то передаётся только его
идентификатор.

Java. Работа с файловой системой. Потоки ввода-вывода.

  • 1.
    Работа с файлами. ВиталийУнгурян unguryan@itstep.org
  • 2.
    Класс File File —единственный класс в java.io, который работает непосредственно с дисковыми файлами. Его задачей является управление информацией о файлах и каталогах.
  • 3.
    Класс File Хотя науровне операционной системы файлы и каталоги отличаются, но в Java они описываются одним классом File.
  • 4.
    Класс File boolean createNewFile(): создаетновый файл по пути, который передан в конструктор. В случае удачного создания возвращает true, иначе false boolean delete(): удаляет каталог или файл по пути, который передан в конструктор. При удачном удалении возвращает true.
  • 5.
    Класс File String getAbsolutePath(): возвращаетабсолютный путь для пути, переданного в конструктор объекта String getName(): возвращает краткое имя файла или каталога String getParent(): возвращает имя родительского каталога
  • 6.
    Класс File boolean isDirectory():возвращает значение true, если по указанному пути располагается каталог boolean isFile(): возвращает значение true, если по указанному пути находится файл boolean isHidden(): возвращает значение true, если каталог или файл являются скрытыми
  • 7.
    Класс File long length(): возвращаетразмер файла в байтах long lastModified(): возвращает время последнего изменения файла или каталога. Значение представляет количество миллисекунд, прошедших с начала эпохи Unix
  • 8.
    Класс File String[] list(): возвращаетмассив файлов и подкаталогов, которые находятся в определенном каталоге File[] listFiles(): возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге
  • 9.
    Класс File boolean mkdir(): создаетновый каталог и при удачном создании возвращает значение true boolean renameTo(File dest): переименовывает файл или каталог
  • 10.
    Интерфейс FilenameFilter Объекту, чтобыреализовать этот интерфейс, требуется определить только один метод — accept(), который будет вызываться один раз с каждым новым именем файла. Метод accept должен возвращать true для тех имён, которые надо включать в список, и false для имён, которые следует исключить.
  • 11.
    ввод/вывод Обобщённое понятие источника вводаотносится к различным способам получения информации: к чтению дискового файла, символов с клавиатуры либо получению данных из сети.
  • 12.
    ввод/вывод Под обобщённым понятиемвывода также могут пониматься дисковые файлы, сетевое соединение и т. п. Эти абстракции дают удобную возможность для работы с вводом- выводом (I/O), не требуя при этом, чтобы каждая часть вашего кода понимала разницу между, скажем, клавиатурой и сетью.
  • 13.
    ввод/вывод В Java абстракцияввода/вывода называется потоком (stream) и реализована в нескольких классах пакета java.io.
  • 14.
    ввод/вывод Ввод данных инкапсулированв абстрактном классе InputStream, Вывод данных — в OutputStream.
  • 15.
    По течению грестилегче Потоки ввода/вывода в Java предоставляют программисту ясную абстракцию для выполнения сложных и зачастую громоздких операций ввода - вывода данных.
  • 16.
    По течению грестилегче Java - программы, опирающиеся на абстракции высокого уровня - классы InputStream и OutputStream, будут и в будущем функционировать правильно - даже тогда, когда будут изобретены новые улучшенные реализации классов ввода - вывода.
  • 17.
    Класс OutputStream OutputStream —абстрактный класс. Задаёт модель выходных потоков Java. Все методы этого класса имеют тип void и возбуждают исключение IOException в случае ошибки.
  • 18.
    Класс InputStream InputStream —абстрактный класс, задающий используемую в Java модель входных потоков. Все методы этого класса при возникновении ошибки возбуждают исключение IOException.
  • 19.
    Файловый поток FileOutputStream FileOutputStream— простейший класс для потокового (последовательного) вывода байтов в файл. Объект этого класса создается на основе объекта File или по имени файла в файловой системе. Создавать объекты этого класса можно независимо от того, существует файл или нет.
  • 20.
    Файловый поток FilelnputStream FilelnputStream- простейший класс для потокового (последовательного) чтения байтов из файла. Объект этого класса создаётся на основе объекта File или по имени файла в файловой системе.
  • 21.
    DataInputStream DataInputStream - классдля потокового (последовательного) чтения данных стандартных типов из файла. Объект этого класса создается на основе объекта InputStream
  • 22.
    Фильтруемые потоки Все конструкторыи методы, имеющиеся в этом классе, идентичны тем, которые есть в классах InputStream и OutputStream, единственное отличие классов фильтруемых потоков в том, что их методы синхронизированы.
  • 23.
    Буферизованные потоки При небуферизованном вводе-выводе каждое чтение, или запрос записи обрабатывается непосредственно базовым ОС. Это может сделать программу намного менее эффективной, так как каждый такой запрос часто инициировал доступ к диску, сетевое действие, или некоторую другую работу, которая относительно дорога.
  • 24.
    Буферизованные Потоки Чтобы уменьшитьэтот вид издержек, платформа Java реализует буферизованные потоки ввода-вывода. Буферизованные входные потоковые данные чтения от области памяти, известной как буфер; собственный входной API вызывают только, когда буфер пуст.
  • 25.
    Буферизованные Потоки Точно также буферизованные потоки вывода пишут данные в буфер, и собственный выходной API вызывают только, когда буфер полон. Буферизованные потоки являются расширением классов фильтруемых потоков
  • 26.
    Классы BufferedInputStream и BufferedOutputStream КлассыBufferedInputStream и BufferedOutputStream используют буферизованный ввод-вывод, поэтому работают более эффективно, чем, например, FileInputStream и FileOutputStream.
  • 27.
    Классы BufferedReader иBufferedWriter Используются для буферизованного ввода-вывода данных, поэтому их использование более эффективно, чем, например, FileReader и FileWriter. Создаются на основе объектов Reader и Writer
  • 28.
    Класс RandomAccessFile RandomAccessFile -класс для произвольного доступа, используется как для чтения, так и для записи. Объект этого класса cоздается на основе объекта File или по имени файла в файловой системе.
  • 29.
    Классы PipedInputStream иPipedOutputStream Классы для канальных потоков ввода-вывода. Хорошо подходят для обмена информацией между процессами.
  • 30.
    Канальные потоки Канальные потоки(piped streams), определяемые классами семейства Piped — используются в виде пар ввода-вывода (записи-чтения); данные, переданные в поток вывода (записи), служат источником для потока ввода (чтения).
  • 31.
    Канальные потоки С каналом(pipe) связан внутренний буфер, ёмкость которого определяется при реализации класса, что позволяет поддерживать разные уровни производительности процессов вывода и ввода; однако средств динамического управления размером буфера не существует.
  • 32.
    Класс ByteArraylnputStream ByteArrayInputStream -это реализация входного потока, в котором в качестве источника используется массив типа byte. У этого класса два конструктора, каждый из которых в качестве первого параметра требует байтовый массив.
  • 33.
    Класс ByteArrayOutputStream ByteArrayOutputStream —два конструктора. Первая форма конструктора создаёт буфер размером 32 байта. При использовании второй формы создаётся буфер с размером, заданным параметром конструктора.
  • 34.
    Класс PushbacklnputStream Одно изнеобычных применений буферизации — реализация операции pushback (вернуть назад). Pushback применяется к InputStream для того, чтобы после прочтения символа вернуть его обратно во входной поток.
  • 35.
    Класс SequencelnputStream Класс SequencelnputStream поддерживаетвозможность слияния нескольких входных потоков в один. В конструкторе класса SequenceInputStream в качестве параметра используется либо два объекта InputStream, либо перечисление, содержащее коллекцию объектов InputStream
  • 36.
    Класс PrintStream Класс PrintStreamпредоставляет все те утилиты форматирования, которые мы использовали в примерах для вывода через файловые дескрипторы пакета System с самого начала.
  • 38.
    Символьные потоки Символьные потокиимеют два основных абстрактных класса Reader и Writer, управляющие потоками символов Unicode.
  • 39.
    Символьные потоки BufferedReader -буферизированный входной символьный поток, увеличивает производительность за счёт буферизации ввода. CharArrayReader - входной поток, который читает из символьного массива
  • 40.
    Символьные потоки FileReader -входной поток, читающий текстовый файл. FilterReader - фильтрующий читатель. InputStreamReader - входной поток, транслирующий байты в символы. LineNumberReader - входной поток, подсчитывающий строки
  • 41.
    Символьные потоки PipedReader -входной канал PushbackReader - входной поток, позволяющий возвращать символы обратно в поток. StringReader - входной поток, читающий из строки.
  • 43.
    Сериализация объектов Сериализация -это процесс сохранения состояния объекта в последовательность байт. Десериализация - это процесс восстановления объекта, из байтового состояния.
  • 44.
    Зачем сериализация нужна? Всегодняшнем мире типичное промышленное приложение будет иметь множество компонентов и будет распространено через различные системы и сети.
  • 45.
    Зачем сериализация нужна? ВJava всё представлено в виде объектов! Если двум компонентам Java необходимо общаться друг с другом, то им необходим механизм для обмена данными.
  • 46.
    Зачем сериализация нужна? Первыйспособ это разработать собственный протокол и передать объект. Это означает, что получатель должен знать протокол, используемый отправителем для воссоздания объекта, что усложняет разработку сторонних компонентов.
  • 47.
    Зачем сериализация нужна? Следовательно,должен быть универсальный и эффективный протокол передачи объектов между компонентами. Сериализация создана для этого, и компоненты Java используют этот протокол для передачи объектов.
  • 48.
    Первый способ сериализации Класссериализуемого объекта должен реализовывать интерфейс import java.io.Serializable; class TestSerial implements Serializable { } Интерфейс Serializable это интерфейс-маркер; в нём не задекларировано ни одного метода. Но говорит сериализующему механизму, что класс может быть сериализован.
  • 49.
    Алгоритм сериализации Java записьметаданных о классе ассоциированном с объектом рекурсивная запись описания суперклассов, до тех пор пока не будет достигнут java.lang.object
  • 50.
    Алгоритм сериализации Java послеокончания записи метаданных начинается запись фактических данных ассоциированных с экземпляром, только в этот раз начинается запись с самого верхнего суперкласса рекурсивная запись данных ассоциированных с экземпляром начиная с самого низшего суперкласса
  • 51.
    Алгоритм сериализации Java Сохранениеобъекта выполняется при помощи класса java.io.ObjectOutputStream. Который является фильтрующим потоком (filter stream) - он окружает низкоуровневый поток байтов (называемый узловым потоком (node stream)) и предоставляет нам поток сериализации.
  • 52.
    Не сериализуемые объекты Сохранятьсямогут лишь объекты, помеченные как Serializable. Класс java.lang.Object не реализует этот интерфейс, поэтому не все объекты Java могут быть автоматически сохранены. Часть классов, включая AWT, компоненты Swing GUI, строки и массивы - сериализуемые.
  • 53.
    Реализация сериализации Используя встроеннуювозможность механизма сериализации, можно реализовать нормальный процесс поместив в свои класс два метода: private void writeObject(ObjectOutputStream out) throws IOException; private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
  • 54.
    Остановите сериализацию! Что есливы создали класс, чей суперкласс сериализуемый, но при этом вы не хотите чтобы ваш класс был сериализуемым? Вы не можете "разреализовать" интерфейс, поэтому если суперкласс реализует Serializable, то и созданный вами новый класс также будет его реализовать.
  • 55.
    Остановите сериализацию! Чтобы остановитьавтоматическую сериализацию вы можете снова применить private методы для создания исключительной ситуации NotSerializableException.
  • 56.
    Создание своего собственного протокола:интерфейс Externalizable Вместо реализации интерфейса Serializable, вы можете реализовать интерфейс Externalizable, который содержит два метода: public void writeExternal(ObjectOutput out) throws IOException; public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
  • 57.
    Кэширование объектов впотоке По умолчанию, ObjectOutputStream сохраняет ссылки на объекты, которые в него записываются. Это означает, что если состояние записываемого объекта, который уже был записан, будет записано снова, новое состояние не сохраняется!
  • 58.
    Граф сериализации При сериализациисвязанных объектов имеет место граф сериализации.
  • 59.
    Граф сериализации Сериализуется объект,если он содержит ссылки или массивы ссылок на сериализуемые объекты, то они сериализуются рекурсивно. При этом сериализуемые объекты помечаются, что исключает зацикливание при обходе графа.
  • 61.
    Граф сериализации Кроме того,для сериализуемых объектов создаются уникальные идентификаторы, которые необходимы для восстановления ссылок при десериализации. Т.е. при первой сериализации объект передаётся «по полной программе» и для него создаётся внутренний идентификатор, если алгоритм повторно «натыкается» на помеченный объект, то передаётся только его идентификатор.