сериализация в Java всегда должны уменьшать память, которая используется для содержания структуры объекта? Или это, вероятно, что сериализация будет иметь более высокие стоимости?
Другими словами: действительно ли сериализация является инструментом для уменьшения объема потребляемой памяти структур объекта в Java?
Править
Я полностью знаю о том, какая сериализация была предназначена для, но спасибо так или иначе :-) Но Вы знаете, инструменты могут неправильно использоваться. Мой вопрос, является ли это хорошим инструментом для уменьшения использования памяти.
Таким образом, что причины можно вообразить, почему использование памяти должно увеличиться/уменьшить? Что произойдет в большинстве случаев?
Мой вопрос в том, является ли это хорошим инструментом для уменьшения использования памяти.
Нет, это не лучший инструмент для этого. Представление сериализованного объекта включает в себя множество «метаданных», которые описывают тип и представление объекта. Если вы не сериализуете значительное количество объектов в один «поток», накладные расходы на «метаданные» сделают сериализованную форму больше, чем исходная форма. Игнорируя эти накладные расходы, сериализованное представление обычно более компактно, но экономия будет в значительной степени зависеть от типов представления объекта. (Для получения дополнительных сведений ознакомьтесь с «Протокол потока сериализации объектов» .)
И, как упоминается в других ответах, вы временно увеличиваете использование памяти при сериализации и десериализации, потому что вам нужно хранить как серийный номер, так и представления объектов И карта, используемая для работы с циклами и т. д.
Если вы хотите представить структуру данных в компактной форме в памяти, вам лучше разработать собственную схему сериализации для конкретного приложения. Но IMO, было бы лучше записать данные в файловую систему или базу данных.
Нет... Сериализация - это способ записи или чтения представления состояния объекта в виде массива байтов. Это не альтернативное представление в памяти. Сериализованная форма объекта может потреблять или не потреблять больше байт, чем он потребляет внутри JVM; обычно это вполне сопоставимо. В редких случаях это может быть больше, а иногда состояние объекта может быть полностью сериализовано таким образом, чтобы потреблять меньше байт, чем в куче. Но нет, чтобы ответить на вопрос, это не "инструмент для уменьшения занимаемой памяти".
Единственный способ сократить объем памяти - это сериализация некоторого объекта с переходными полями, сброс исходных объектов и десериализация - так вы потеряете объекты в переходных полях.
При сериализации объектов значения всех (непереходных) полей и некоторые дополнительные данные управления записываются в буфер (поток). Обычно этот буфер записывается в файл или сокет. На сериализованные объекты это не повлияет.
На самом деле все наоборот: сериализация (временно) увеличивает объем памяти, потому что сериализованное представление объекта также будет находиться в памяти.
Сериализация в любом случае не связана с уменьшением объема памяти, это в основном процесс сохранения состояния объекта в последовательности байтов и преобразования этих байтов в живой объект в будущем. Он в основном используется для хранения состояния объектов, чтобы их можно было использовать по истечении срока службы виртуальной машины, объект можно реконструировать и использовать, когда и где это необходимо.
Я говорю МОЖЕТ БЫТЬ ДА (если сжатие == рост / увеличение), потому что сериализация сохраняет представление объекта в памяти во время это процесс.
Если вы хотите остановить это, вам нужно вызвать close или reset для ObjectOutputStream.
Если вы вызываете new ObjectOutputStream / close, после закрытия не остается места в памяти.