2015-02-16 3 views
1

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

Идея заключается в следующем:

У меня есть объект в сборке мусора языка (например, C# или Java). Объекты могут содержать несколько объектов, но ссылки на любые другие объекты, которые не являются подэлементом объектов (или самого объекта), отсутствуют. Теоретически можно получить память, используемую этим объектом, которая, скорее всего, не является связанной частью. Поскольку у меня есть некоторые знания об объектах, я могу найти все ссылочные переменные/свойства и указатели, которые в конце указывают на другой фрагмент памяти (возможно, косвенно, в зависимости от реализации языка программирования и виртуальной машины). Я могу взять эти фрагменты памяти, объединяя их в большую часть памяти (исправляя ссылки/указатели, чтобы они все еще остались нетронутыми). Эта часть памяти, в основном байты, может быть записана в хранилище, например, в базу данных или в кеш redis. На другой машине я мог бы теоретически снова загрузить этот объект и поместить его в память виртуальной машины (возможно, снова исправить ссылки/указатели, если они являются абсолютными и не относительными). Тогда у меня должен быть тот же объект на другой виртуальной машине. Объект может быть настолько сложным, насколько я хочу, может также содержать события или что-то еще, и я мог бы получить состояние объекта, переданного в пылевую виртуальную машину (работающий на другом компьютере). Единственное условие состоит в том, что он не будет содержать ссылок на что-либо вне объектов. И, конечно, я должен знать тип класса объекта на другой виртуальной машине.

Я задаю этот вопрос, потому что хочу поделиться состоянием объекта, и я думаю, что вся эта работа по сериализации - это просто накладные расходы, и было бы очень просто, если бы я мог просто заморозить память и перенести ее на другую виртуальную машину.

Возможно, это возможно, я бы сказал, да, хотя это может быть сложно. возможно, это невозможно с некоторыми VM из-за их архитектуры. Что-то вроде этого существует на любом языке программирования? Может быть, даже в не мусорных сборниках?

ПРИМЕЧАНИЕ: Я не уверен, какие теги должны быть добавлены к этому вопросу, кроме как на языке программирования, также я не уверен, что может быть лучшее место для такого вопроса. Пожалуйста, простите меня.

EDIT:

Может быть, понятие можно сравнить с initrd на Linux или спящего режима в целом.

+0

«Объекты могут содержать несколько объектов, но нет ссылок на какие-либо другие объекты». Это звучит как противоречие со мной. Не могли бы вы пояснить, что вы имели в виду? – svick

+0

Я имею в виду никаких ссылок на внешний мир. Ни один подэлемент объекта не ссылается ни на что другое, кроме подэлементов объекта или самого объекта. – Sjoerd222888

+0

Но этого никогда не может быть, все, что ссылается на объект, является подэлементом по определению. – svick

ответ

1
  1. вам нужно будет собрать все ссылки на другие объекты. включая графики объектов (циклов) без дублирования. для этого потребуется какой-то «остановить мир», по крайней мере, для сериализации потока. это сложно сделать эффективно, но возможно - собственные механизмы сериализации на многих языках (java) делают это для разработчика.
  2. вам понадобится какая-то виртуальная машина для абстрагирования от байтового порядка в разных аппаратных архитектурах.
  3. вам придется отсоединять объект от любой среды. вы не можете передавать объекты, представляющие потоки, файлы, дескрипторы, сокеты и т. д., как вы его обнаружите?
  4. В настоящее время системная память является виртуальной, поэтому будет невозможно просто скопировать адреса с одной машины на другую - вам придется перевести их
  5. объекты - это не только данные, видимые разработчику, но и структура, информация песочницы, разрешения, суперклассы, какие методы/типы уже были загружены и которые еще не загружены из-за оптимизации и ленивой загрузки, метаданных сборщика мусора и т. д.
  6. версия вашего объекта/класса. на одном машинном классе A может быть создан из источника ver 1, но на другой машине там уже могут быть объекты класса A, построенные из источника версии 2
  7. принять во внимание. будет ли это быстрее, чем сериализация старой школы? какие выгоды он получит?
  8. и, вероятно, многие другие вещи, никто из нас не думал о

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