2012-05-14 3 views
2

Мне нужно глубоко копировать объекты Java для одного из моих проектов; и мне было интересно, можно ли использовать сериализацию для этого.Java: производительность сериализации для глубокой копии?

Объекты довольно маленькие (< 1kb каждый), всего # объектов на экземпляр будет < 500, а процедура копирования будет вызываться несколько раз в день. В этом случае, можно ли использовать сериализацию для этого в производстве, или это еще очень плохая идея, учитывая производительность Serialization?

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

+4

Для чего-то, что будет вызываться несколько раз в день, производительность практически не имеет значения, если вы не постулируете, что сериализация вашего графика объекта займет более восьми часов. – EJP

+0

+1. Измерьте время этого быстрого письменного кода, прежде чем обдумывать другие решения. Да, это медленно. Но, вероятно, вы не заметите этого достаточно медленно. И вы легко замените его позже, если потребуется. –

+0

@ EJP, thx. Я никогда не делал этого для производства раньше, поэтому пытался выяснить, кто-то сделал это раньше, и какие-либо проблемы с производительностью. – shrini1000

ответ

1

Возможно. Производительность не будет проблемой - зависимости будут.

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

Хуже того, если вам нужно сериализации для глубокой копии и реальной государственной экономии, вы могли бы в конечном итоге с несовместимыми целями:

  • Deep копия должна быть быстрой
  • Deep копия может обрабатывать открытые ресурсы (соединения с базой данных)
  • Сохранение состояния требует обработки API (состояние хранится на диске, его можно восстановить с новой версией кода).
  • Государственной экономия может извлечь выгоду из использования читаемой формы (так человек может исправить ошибки)

Поэтому часто лучше использовать copy constructors чем с помощью «умной хак», даже если это может безопасно вам некоторые/а много времени прямо сейчас.

+0

Почему бы глубокая копия и реальное сохранение состояния несовместимы? – Thalatta

+1

@Thalatta Как я понимаю, «глубокая копия» создает рабочую копию в памяти, которую вы можете использовать сразу. «Сохранение состояния» означает сохранение состояния некоторых объектов на диске, которые будут восстановлены позднее. Это означает, что глубокая копия может обрабатывать ссылки, такие как соединения с базой данных, в то время как сохранение состояния не может. Глубокая копия должна быть быстрой, сохранение состояния должно гарантировать, что состояние может быть восстановлено, даже когда объекты меняются (эволюция кода). –