Почему каждый тип объекта не является сериализуемым?

Существует большое объяснение этой темы в Дженерики Java и Наборы Maurice Naftalin, Philip Wadler. Я настоятельно рекомендую эту книгу. Заключить в кавычки:

Дженерики в Java напоминают шаблоны в C++.... Синтаксис сознательно подобен, и семантика сознательно отличаются.... Семантически, дженерики Java определяются стиранием, где, поскольку шаблоны C++ определяются расширением.

считайте полное объяснение здесь .

alt text
(источник: oreilly.com )

10
задан Bill Karwin 21 August 2009 в 06:18
поделиться

6 ответов

У меня есть код, который извлекает изображение из Интернета и сохраняет его в модели. Важные части:

from django.core.files import File  # you need this somewhere
import urllib


# The following actually resides in a method of my model

result = urllib.urlretrieve(image_url) # image_url is a URL to an image

# self.photo is the ImageField
self.photo.save(
    os.path.basename(self.url),
    File(open(result[0], 'rb'))
    )

self.save()

Это немного сбивает с толку, потому что это вытащено из моей модели и немного вне контекста, но важные части:

  • Изображение, извлеченное из Интернета, не сохранено в папке upload_to он вместо этого сохраняется как временный файл с помощью urllib.urlretrieve () и позже удаляется.
  • ImageField. объект, который служит аутентифицированным подключение к базе данных, потому что для этого вам понадобится сериализованная форма для содержать пароль в виде открытого текста. Эта не будет хорошей практикой, потому что кто-то может получить спасенных сериализованная форма. У тебя тоже нет идея, когда вы десериализуете, что сервер базы данных все еще работает, может быть доступными, аутентификация учетные данные все еще действительны и т.д.

18
ответ дан 3 December 2019 в 15:35
поделиться

Даже если вы рассматриваете только объекты, которые не включают состояние ОС, проблема сложнее, чем кажется на первый взгляд. На графике могут быть циклы. На сущности могут ссылаться несколько сущностей верхнего уровня.

Я попытался описать универсальную библиотеку сериализации на языке c в предыдущем ответе и обнаружил, что есть несколько сложных случаев.

5
ответ дан 3 December 2019 в 15:35
поделиться

Нет, потому что иногда у вас нет всей информации в том месте, где вы их восстанавливаете. Помните, что вы можете реконструировать объект не в том же контексте, в котором он был у вас; это может быть другая машина или даже другой язык.

3
ответ дан 3 December 2019 в 15:35
поделиться

Насколько разумно сериализовать объект, который содержит сетевое соединение и отвечает за потоковую передачу данных обратно с веб-сервера?

А как насчет десериализации, как это будет работать? Следует ли повторно открыть соединение, повторно загрузить файл?

1
ответ дан 3 December 2019 в 15:35
поделиться

Технически любой объект в области памяти может быть сериализован и сохранен на надежном носителе, таком как жесткий диск. В конце концов, большинство операционных систем переносят активную память на диск и с диска, а многие также имеют функцию гибернации. Проблема заключается в области видимости, например: вы создаете строковый объект в своем пространстве памяти, и вы можете сериализовать и десериализовать его по своему усмотрению. Когда вы открываете файл, ОС дает вам дескриптор файла, но ОС по-прежнему владеет файловой системой, содержащей фактический файловый объект, к которому у вас есть дескриптор. С другой стороны, драйвер файловой системы должен поддерживать постоянную базу данных дескрипторов файлов и других метаданных, связанных с файлами.

0
ответ дан 3 December 2019 в 15:35
поделиться

В каком-то смысле вы правы в своих предположениях.

Должна быть возможность разбить набор всех объектов в программе на группы

1) У вас есть полная информация, которая позволяет полную деконструкцию и реконструкцию объекта. Массивы чисел или строк, структуры - хорошие примеры.

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

3) У вас нет информации о конструкции, объект каким-то образом был получен случайным образом.

Здесь, чтобы иметь возможность полностью сериализовать объекты, мы должны перейти от 3) к 2) к 1). Объекты в 3) могут быть атрибутами объекта типа 2) и могут быть извлечены путем успешного восстановления объекта типа 2).

Объект типа 2), однако, должен быть реконструирован путем сериализации только информации о конструкции, которая должна иметь тип 1), например числа и строки, истинные данные.

Вся эта схема кажется дорогостоящей, поскольку, если мы хотим реконструировать все состояние программы, мы должны работать с абстракциями, которые инкапсулируют объекты типа 2). И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, когда мы ожидаем собирать только объекты типа 1.

Объекты в 3) могут быть атрибутами объекта типа 2) и могут быть извлечены путем успешного восстановления объекта типа 2).

Объект типа 2), однако, должен быть реконструирован путем сериализации только информации о конструкции, которая должна иметь тип 1), например числа и строки, истинные данные.

Вся эта схема кажется дорогостоящей, поскольку, если мы хотим реконструировать все состояние программы, мы должны работать с абстракциями, которые инкапсулируют объекты типа 2). И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, когда мы ожидаем собирать только объекты типа 1.

Объекты в 3) могут быть атрибутами объекта типа 2) и могут быть извлечены путем успешного восстановления объекта типа 2).

Объект типа 2), однако, должен быть реконструирован путем сериализации только информации о конструкции, которая должна иметь тип 1), например числа и строки, истинные данные.

Вся эта схема кажется дорогостоящей, поскольку, если мы хотим реконструировать все состояние программы, мы должны работать с абстракциями, которые инкапсулируют объекты типа 2). И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, когда мы ожидаем собирать только объекты типа 1.

должны быть восстановлены путем сериализации только информации о конструкции, которая должна быть типа 1), например чисел и строк, истинных данных.

Вся эта схема кажется дорогостоящей, поскольку, если мы хотим восстановить все состояние программы, мы должны работать с абстракциями, которые инкапсулируют объекты типа 2). И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, когда мы ожидаем собирать только объекты типа 1.

должны быть восстановлены путем сериализации только информации о конструкции, которая должна быть типа 1), например чисел и строк, истинных данных.

Вся эта схема кажется дорогостоящей, поскольку, если мы хотим восстановить все состояние программы, мы должны работать с абстракциями, которые инкапсулируют объекты типа 2). И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, когда мы ожидаем собирать только объекты типа 1.

И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, когда мы ожидаем собирать только объекты типа 1.

И мы должны знать, что мы делаем, когда объект не может быть реконструирован. Кроме того, мы должны быть уверены, что мы не смешиваем объекты этих типов, что мы не смешиваем объекты типа 3 или 2, когда мы ожидаем собирать только объекты типа 1.

1
ответ дан 3 December 2019 в 15:35
поделиться
Другие вопросы по тегам:

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