Каково различие между сериализуемым и Externalizable в Java?

Давайте рассмотрим ваш код:

p = turtle.Pen()
p.reset()

Для чего reset()? Ничего еще не было установлено , установлено , так почему же сбросить ? Не добавляйте код, который не продвигает вашу цель. Снова здесь:

p.down()

Ручка начинается вниз, поэтому нет необходимости ее менять. В этой команде:

p.speed(22)

Откуда 22 пришли? Документация для speed() говорит, что аргумент от 1 («самый медленный») до 10 («быстрый»), где 0 означает «самый быстрый» Это превращает 22 в какое-то другое значение - если вы не знаете что, тогда не используйте его! Для ясности вы должны использовать символические альтернативы, такие как «медленный».

    p.left(22222)

Откуда 22222 пришел? Почему ты удивлен, что у тебя нет треугольника? Для идеального равностороннего треугольника мы бы использовали 120 градусов, но нам не нужен идеальный треугольник, нам нужна спираль, поэтому мы добавим к этому значению градус или два. Почему это имя переменной:

dog = 0

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

Наконец, нам нужен один цикл, а не два, чтобы изменения рисунка и цвета происходили одновременно:

from turtle import Screen, Pen
import colorsys

screen = Screen()
screen.title("Rainbow Spiral")

pen = Pen()
pen.speed('fastest')

hue = 0.0  # range is 0.0 to 1.0

for i in range(200):
    color = colorsys.hsv_to_rgb(hue, 1, 1)  # pen wants RGB
    pen.pencolor(color)
    pen.forward(i * 2)  # double size
    pen.right(121)  # 120 degrees is an equilateral triangle
    hue += 0.005  # increment by 1/200

pen.hideturtle()

screen.exitonclick()

Обратите внимание, что я изменил left() на right(), чтобы соответствовать вашему пример спирали.

ВЫХОД

enter image description here

Программы рассказывают историю. Тщательно выбирайте имена персонажей (переменные) и избегайте включения элементов (кода) в историю, которые не влияют на ее исход.

280
задан Naman 24 November 2018 в 20:24
поделиться

3 ответа

Чтобы добавить к другим ответам, реализовав java.io.Serializable , вы получите возможность «автоматической» сериализации. для предметов вашего класса. Не нужно реализовывать какую-либо другую логику, это будет просто работать. Среда выполнения Java будет использовать отражение, чтобы выяснить, как упорядочить и распаковать ваши объекты.

В более ранней версии Java отражение было очень медленным, и поэтому сериализация больших графов объектов (например, в клиент-серверных приложениях RMI) была немного проблема с производительностью. Чтобы справиться с этой ситуацией, был предоставлен интерфейс java.io.Externalizable , который похож на java.io.Serializable , но с пользовательскими механизмами для выполнения функций маршаллинга и демаршаллинга (вам нужно реализовать методы readExternal и writeExternal в вашем класс). Это дает вам возможность обойти узкое место производительности отражения.

В последних версиях Java (конечно, начиная с версии 1.3) производительность отражения значительно выше, чем раньше, и поэтому это гораздо меньше проблем. Я подозреваю, что вам будет трудно получить значительную выгоду от Externalizable с современной JVM.

Кроме того, встроенный механизм сериализации Java не единственный, вы можете получить сторонние замены, такие как JBoss Serialization, который значительно быстрее и является заменой по умолчанию.

Большим недостатком Externalizable является то, что вы должны поддерживать эту логику самостоятельно - если вы добавляете, удаляете или изменяете поле в своем классе, вы должны изменить свой writeExternal / readExternal методы для его учета.

Таким образом, Externalizable является пережитком Java 1.1 дней. В этом больше нет необходимости.

263
ответ дан 23 November 2019 в 02:00
поделиться

Serialization uses certain default behaviors to store and later recreate the object. You may specify in what order or how to handle references and complex data structures, but eventually it comes down to using the default behavior for each primitive data field.

Externalization is used in the rare cases that you really want to store and rebuild your object in a completely different way and without using the default serialization mechanisms for data fields. For example, imagine that you had your own unique encoding and compression scheme.

21
ответ дан 23 November 2019 в 02:00
поделиться

https://docs.oracle.com/javase/ 8 / docs / platform / serialization / spec / serialTOC.html

Сериализация по умолчанию несколько многословна и предполагает максимально широкий сценарий использования сериализованного объекта, и, соответственно, формат по умолчанию (Serializable) аннотирует результирующий поток информацией о класс сериализованного объекта.

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

Кроме того (как указывает Ури) экстернализация также обеспечивает полный контроль над кодированием данных в потоке, соответствующем типам Java. Для (надуманного) примера вы можете записать логическое true как «Y» и false как «N». Экстернализация позволяет вам сделать это.

7
ответ дан 23 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: