2015-06-19 6 views
0

Это мой первый вопрос к StackOverflow. Пожалуйста, дайте мне знать, если вопрос непонятен и вам нужны какие-либо подробности.Частичная десериализация огромного двоичного файла - Java

У меня есть класс, который имеет три атрибута, как это:

class SampleClass { 
long [] field1; 
float[] field2; 
float[] field3; 
} 

Огромный объект SampleClass построен (около миллиарда записей для каждого массива). Этот объект сериализуется в одном хосте, и сериализованный файл загружается на другой компьютер. Теперь я хочу десериализовать только часть файла, чтобы я мог получить меньший объект SampleClass с примерно 10 индексами, заполненными для каждого поля, а не для полного объекта. Поскольку этот аппарат не имеет достаточной емкости для загрузки такого огромного объекта в память. Это возможно?

Объект сериализуется с использованием метода writeObject JAVA и выполняется другой утилитой, поэтому я не могу контролировать его. Заранее спасибо.

+0

Должен ли этот объект не храниться в базе данных, а не в двоичном файле? – John

ответ

0

Забудьте, используя API-интерфейс сериализации Java - он предназначен только для десериализации всего. Если у вас нет контроля над созданием сериализованного файла, вы должны рассмотреть синтаксический разбор сериализованного файла самостоятельно и извлечение необходимых частей - это не так уж сложно.

Формат сериализации Java хорошо документированный (смотрите, например, official docs, informative article), и существуют инструменты для разбора формата (например, Serialysisjdeserialize), хотя это не особенно трудно написать свой собственный инструмент на основе формата спецификации ,

После того как вы сможете проанализировать сериализованные данные, вы можете просто извлечь то, что вам нужно, и пропустить то, что вам не нужно.

0

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

1) загрузки всего файла в объект

2) создать новый объект SampleClass

3) копировать элементы из требуемой области в каждом массиве в пустую SampleClass объекта

4) сериализует уменьшенную версию

Если это поможет любому, поля могут быть сделаны преходящим, поэтому они не будут упорядочены.

Тем не менее, он смотрит на меня, что этот объект должен быть в базе данных:

  • Это не соответствует виртуальной памяти
  • только часть этого требуется в данный момент времени.

Таким образом, вы можете использовать жесткий диск для его хранения и запросов для получения требуемых частей.

Смежные вопросы