Маршалинг / сериализация в PHP так же просты, как сериализация ($ var)? - PullRequest
6 голосов
/ 11 апреля 2010

вот определение маршалинга из Википедии:

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

Я всегда выполнял сериализацию данных в php через функцию сериализации, обычно для объектов или массивов. Но как определение маршалинга / сериализации в Википедии происходит в этой serizalize() функции?

Ответы [ 2 ]

3 голосов
/ 11 апреля 2010

Чего не делает serialize, так это определения транспортных классов. При десериализации объекта должно присутствовать определение класса этого объекта (загруженное из базы кода), иначе десериализация завершится неудачно. Из статьи Википедии, которую вы упоминаете :

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

Если я правильно понимаю, Serialize определенно не на 100% совместим с определением маршалинга в этом отношении. Я не знаю заранее определенного механизма, который бы делал это в PHP. Я полагаю, вам придется объединить сериализованные данные и все необходимые определения классов в пакет (например, ZIP-файл).

1 голос
/ 11 апреля 2010

Как и Pekka, упомянутый выше, PHP не включает определение класса, поэтому он не выполняет маршалинг. Однако, если класс для сериализованного объекта присутствует, то ответ на ваш вопрос - да: сериализация равна так же просто, как serialize($abc).

Лучший способ, который я знаю, чтобы позаботиться о маршалинге в PHP, это использовать сторонний инструмент, такой как Google Buffer Protocols или Facebook (Apache?) Thrift, который будет сериализовать и маршалировать для вас. Какой-то окольный способ сделать это (и пока у вас есть класс, вам все равно не нужно маршалировать), но они, вероятно, являются лучшим решением проблемы.

...