Danyloff

🧬 БСриализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² PHP ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅


  • Β·

Β· Β·
Β·

БСриализация β€” это Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ структуру Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΉ для хранСния ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ (Ρ‡Π°Ρ‰Π΅ всСго β€” Π² строку). Π­Ρ‚ΠΎΡ‚ процСсс Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ», ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎ сСти ΠΈΠ»ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² распрСдСлённой систСмС. Π‘ появлСниСм распрСдСлённых Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€, мСТпроцСссного взаимодСйствия ΠΈ web-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² сСриализация стала Π½Π΅ΠΎΡ‚ΡŠΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ соврСмСнной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ сСриализация Ρ€Π°Π·Π²ΠΈΠ²Π°Π»Π°ΡΡŒ вмСстС с ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠ΅ΠΉ языков ΠΈ стандартов ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… β€” ΠΎΡ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π² RPC Π΄ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… JSON ΠΈ XML. Π’ PHP ΠΎΠ½Π° сущСствуСт с самых Ρ€Π°Π½Π½ΠΈΡ… вСрсий ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ встроСнныС Ρ‚ΠΈΠΏΡ‹, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, играя Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² Ρ‚Π°ΠΊΠΈΡ… тСхнологиях, ΠΊΠ°ΠΊ сСссии, кСши ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

πŸ™… ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ стандартных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сСриализации

НСсмотря Π½Π° удобство встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ json_encode ΠΈ serialize, ΠΈΡ… использованиС Β«ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽΒ» ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ряду ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. json_encode ΠΏΠ»ΠΎΡ…ΠΎ справляСтся со слоТными структурами, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, цикличСскиС зависимости ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ свойства β€” ΠΎΠ½ΠΈ просто Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΠΈΡΠΊΠ°ΠΆΠ°ΡŽΡ‚ΡΡ Π² процСссС сСриализации. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, JSON Π½Π΅ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ восстановлСниС ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° становится Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, serialize Π² PHP сохраняСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ классах ΠΈ свойствах, Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ строку, ΡƒΡΠ·Π²ΠΈΠΌΡƒΡŽ для Π°Ρ‚Π°ΠΊ ΠΏΡ€ΠΈ дСсСриализации, особСнно Ссли Π²Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ сСриализованныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ·Π²Π½Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ serialize спСцифичСн для PHP ΠΈ Π½Π΅ совмСстим с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π΅ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ для ΠΌΠ΅ΠΆΡŠΡΠ·Ρ‹ΠΊΠΎΠ²ΠΎΠ³ΠΎ взаимодСйствия.

Π’Π°ΠΊΠΆΠ΅ стоит ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Π½Π°ΠΈΠ²Π½ΠΎΠ³ΠΎ использования ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²ΠΈΠ΄Π° toJson, toXml ΠΈ ΠΈΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ…. Они, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ «Π² Π»ΠΎΠ±» β€” Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° влоТСнности, контроля Π½Π°Π΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ, ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌΠΈ полями ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

ОсобСнно слоТной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ становится дСсСриализация слоТных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ восстановлСнии Π½Π΅ просто массива Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ†Π΅Π»ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ с влоТСнностями, ассоциациями ΠΈ зависимостями. ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ срСдства Π²Ρ€ΠΎΠ΄Π΅ json_decode Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ стандартныС stdClass ΠΈΠ»ΠΈ массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ Π½Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ автоматичСски ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² экзСмпляры Π½ΡƒΠΆΠ½Ρ‹Ρ… классов. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ автоматичСскоС восстановлСниС слоТной структуры Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€ΡƒΡ‡Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ: приходится ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнныС Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ контСкст, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ свойства ΠΈ Ρ‚. Π΄.

ОсобСнно тяТСло обстоят Π΄Π΅Π»Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ содСрТат Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ классы с зависимостями (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π°Ρ‚Π°-классы ΠΈΠ»ΠΈ value objects), ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ встрСчаСтся Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² случаС цикличСских ссылок). Π’ Ρ‚Π°ΠΊΠΎΠΉ ситуации Π²Π°ΠΆΠ΅Π½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ порядком восстановлСния, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ дублирования), Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ ΡƒΡ‡Ρ‘Ρ‚ контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ происходит дСсСриализация (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π°Π²Π° доступа ΠΈΠ»ΠΈ локализация). Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ дСсСриализационной систСмы, которая ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ слоТныС Π³Ρ€Π°Ρ„Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², распознаёт Ρ‚ΠΈΠΏΡ‹, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌΠΈ свойствами ΠΈ позволяСт ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ процСссом Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ этапС.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ срСдства PHP Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π°ΠΊΠΈΡ… возмоТностСй Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ», ΠΈ ΠΏΡ€ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ слоТности ΠΌΠΎΠ΄Π΅Π»ΠΈ дСсСриализация быстро становится Ρ…Ρ€ΡƒΠΏΠΊΠΎΠΉ, Π½Π΅Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΠΉ ΠΈ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ сопровоТдаСмой.

🫢 БпасаСмся внСшними инструмСнтами

Π’ΠΎΡ‚ Ρ‚Ρ€ΠΈ популярных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для сСриализации Π² PHP:

  1. Symfony Serializer
    Symfony Serializer β€” это мощная ΠΈ гибкая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для сСриализации ΠΈ дСсСриализации Π΄Π°Π½Π½Ρ‹Ρ…. Она ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ мноТСство Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ JSON, XML, YAML ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ОсновноС прСимущСство β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ массивами с ΠΏΠΎΠ»Π½ΠΎΠΉ настройкой. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс сСриализации, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ поля, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ².
  2. JMS Serializer
    JMS Serializer β€” это Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° популярная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для сСриализации ΠΈ дСсСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² PHP. Она прСдоставляСт ΠΌΠΎΡ‰Π½Ρ‹Π΅ возмоТности, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² (JSON, XML, YAML, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…). JMS Serializer Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс сСриализации с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с цикличСскими зависимостями ΠΈ частичной сСриализациСй.
  3. Spiral Serializer
    Spiral Serializer β€” это лСгковСсная ΠΈ Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для сСриализации Π΄Π°Π½Π½Ρ‹Ρ…. Она ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹, ΠΊΠ°ΠΊ JSON, XML ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΈ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ОсновноС прСимущСство этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” Π΅Ρ‘ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с большими ΠΎΠ±ΡŠΡ‘ΠΌΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Spiral Serializer идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π³Π΄Π΅ Π²Π°ΠΆΠ½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΈ минимальноС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΡ€ΠΈ сСриализации.

ВсС инструмСнты ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ ΠΏΠΎ своСму Π½ΠΎ, сСйчас ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ JMS Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΡ‡ΠΈΡ‚Π°ΡŽ Π΅Π³ΠΎ самым ΠΌΠΎΡ‰Π½Ρ‹ΠΌ.

βž• ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° JMS Serializer:
  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ настройка: JMS Serializer позволяСт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ процСсс сСриализации ΠΈ дСсСриализации. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ XML-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ поля ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΈΠΌΠ΅Π½Π° Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²: Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JSON ΠΈ XML, Π½ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ YAML ΠΈ CSV. Π­Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½ΡƒΠΆΠ΄, Π½Π΅ бСспокоясь ΠΎ нСсовмСстимости ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ.
  • Π Π°Π±ΠΎΡ‚Π° с цикличСскими зависимостями: JMS Serializer прСдоставляСт Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с цикличСскими зависимостями, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Ρ‘ идСальной для слоТных ΠΈ взаимосвязанных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° вСрсии ΠΈ условной сСриализации: Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ процСссом сСриализации Π² зависимости ΠΎΡ‚ вСрсии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² зависимости ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… условий, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² многоконтСкстных прилоТСниях ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ….
  • Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ: JMS Serializer ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ интСгрируСтся с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ PHP-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Symfony ΠΈ Laravel, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Ρ‘ популярным Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ для использования Π² ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….
  • Аннотации для упрощСния ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: ВмСсто нСобходимости ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ слоТныС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, JMS Serializer позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π² классах, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ настройку ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Ρ‡ΠΈΡ‰Π΅.

πŸ–‹οΈ ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ сСриализатор Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ класс User, Address ΠΈ CharacterTrait(Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с Ρ‚Ρ€Π΅ΠΉΡ‚Π°ΠΌΠΈ PHP)

<?php

class User
{
    private string $name;
    private Address $address;
    private array $traits;
    private DateTimeImmutable $birthday;
    private Gender $gender;

    /**
     * @param CharacterTrait[] $traits
     */
    public function __construct(
        string $name,
        Address $address,
        array $traits,
        DateTimeImmutable $birthday,
        Gender $gender
    ) {
        $this->name = $name;
        $this->address = $address;
        $this->traits = $traits;
        $this->birthday = $birthday;
        $this->gender = $gender;
    }
}

class Address
{
    private string $street;
    private string $city;
    private string $country;

    public function __construct(string $street, string $city, string $country)
    {
        $this->street = $street;
        $this->city = $city;
        $this->country = $country;
    }
}

class CharacterTrait
{
    private string $trait;

    public function __construct(string $trait)
    {
        $this->trait = $trait;
    }
}

Enum Gender: string {
    case MAN = 'M';
    case WOMAN = 'W';
}

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ 3 класса Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ΡŒΡΡ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ/Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², XML ΠΈΠ»ΠΈ Yaml. Атрибуты/Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ прСдоставляСт сам ΠΏΠ°ΠΊΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JMS. Π― Π±ΡƒΠ΄Ρƒ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ наши классы.

<?php

use JMS\Serializer\Annotation as JMS;

class User
{
    #[JMS\Type('string')]
    private string $name;

    #[JMS\Type(Address::class)]
    private Address $address;

    #[JMS\Type('array<'. CharacterTrait::class .'>')]
    #[JMS\SerializedName('character_traits')]
    private array $traits;

    #[JMS\Type('DateTimeImmutable')]
    private DateTimeImmutable $birthday;
    
    #[JMS\Type('enum<'. Gender::class .'>')]
    private Gender $gender;
}

class Address
{
    #[JMS\Type('string')]
    private string $street;

    #[JMS\Type('string')]
    private string $city;

    #[JMS\Type('string')]
    private string $country;
}

class CharacterTrait
{
    #[JMS\Type('string')]
    private string $trait;
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ сСриализуСм этот слоТный Π°Π³Ρ€Π΅Π³Π°Ρ‚ Π² JSON.

<?php

use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;
use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerBuilder;

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ инстанс сСриализатора с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ»Π΄Π΅Ρ€Π°
SerializerBuilder::create()
    ->enableEnumSupport() // Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Enum Ссли Π½ΡƒΠΆΠ½ΠΎ
    ->setSerializationContextFactory(function () {
        return SerializationContext::create()
            ->setSerializeNull(true);
    })
    ->setPropertyNamingStrategy(
        new SerializedNameAnnotationStrategy(
            new IdenticalPropertyNamingStrategy(),
        ),
    )
    ->build();

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса User
$user = new User(
    'Mark',
    new Address('12 Khreshchatyk St.', 'Kyiv', 'Ukraine'),
    [
        new CharacterTrait('Honest'),
        new CharacterTrait('Creative'),
        new CharacterTrait('Ambitious'),
        new CharacterTrait('Empathetic'),
        new CharacterTrait('Reliable'),
    ],
    new DateTimeImmutable('now'),
);

// Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сСриализованный Π² json ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ User
echo $serializer->serialize($user, 'json');
{
"name": "Mark",
"address": {
"street": "12 Khreshchatyk St.",
"city": "Kyiv",
"country": "Ukraine"
},
"character_traits": [
{"trait": "Honest"},
{"trait": "Creative"},
{"trait": "Ambitious"},
{"trait": "Empathetic"},
{"trait": "Reliable"}
],
"birthday": "2025-04-14T15:12:21+00:00",
"gender": "W"
}

Часто процСсс сСриализации ΠΈΠ΄Π΅Ρ‚ вмСстС с дСсСриализациСй. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ строку Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ нашСго класса User с Π΅Π³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄

<?php

$serializer->deserialize(
    $serialized, // БСриализованная строка Π² json
    User::class, // Π’ΠΈΠΏ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСриализатор ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ строку
    'json' // Π’ΠΈΠΏ сСриализованных Π΄Π°Π½Π½Ρ‹Ρ…
);

А Ρ‡Ρ‚ΠΎ с сСриализациСй Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚? НапримСр сСриализация Π² XML, Yaml ΠΈ Ρ‚Π΄. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ сСриализация Π² Yaml Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°. Но Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² XML, с Π΅Π³ΠΎ спСцифичСским Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ всС Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ User с Π΅Π³ΠΎ влоТСнностями ΠΈ опишСм с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ΄ XML.

<?php

use JMS\Serializer\Annotation as JMS;

#[JMS\XmlRoot('user')]
class User
{
    #[JMS\Type('string')]
    #[JMS\SerializedName('name')]
    #[JMS\XmlElement(cdata: false)]
    private string $name;

    #[JMS\Type(Address::class)]
    #[JMS\SerializedName('address')]
    private Address $address;

    #[JMS\Type('array<' . CharacterTrait::class . '>')]
    #[JMS\SerializedName('character_traits')]
    #[JMS\XmlList(inline: true, entry: 'trait')]
    private array $traits;

    #[JMS\Type('DateTimeImmutable')]
    #[JMS\XmlElement(cdata: false)]
    private DateTimeImmutable $birthday;

    #[JMS\Type('enum<' . Gender::class . '>')]
    #[JMS\XmlElement(cdata: false)]
    private Gender $gender;
}

#[JMS\XmlRoot('address')]
class Address
{
    #[JMS\Type('string')]
    #[JMS\XmlElement(cdata: false)]
    private string $street;

    #[JMS\Type('string')]
    #[JMS\XmlElement(cdata: false)]
    private string $city;

    #[JMS\Type('string')]
    #[JMS\XmlAttribute]
    private string $country;
}

#[JMS\XmlRoot('trait')]
class CharacterTrait
{
    #[JMS\Type('string')]
    #[JMS\XmlValue(cdata: false)]
    private string $trait;
}

πŸ“‹ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, эта ΡΡ‚Π°Ρ‚ΡŒΡ Π΄Π°Π»Π° ΠΎΠ±Π·ΠΎΡ€ возмоТностСй сСриализации ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² PHP с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JMS Serializer. ΠœΡ‹ рассмотрСли, ΠΊΠ°ΠΊ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π³ΠΈΠ±ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Π΄Π΅ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ JSON ΠΈ XML, с использованиСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΈ использовании стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ json_encode ΠΈ serialize.

ИспользованиС JMS Serializer прСдоставляСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС гибкости, Ρ‡Π΅ΠΌ стандартныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈ позволяСт Π»Π΅Π³ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ слоТными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ структурами, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ сСриализации для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΄Π°Ρ‘Ρ‚ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, обСспСчивая ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ восстановлСниС.

Для получСния Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΈΡ… Π·Π½Π°Π½ΠΈΠΉ ΠΎ возмоТностях Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΅Ρ‘ функциях, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ настройка кастомных сСриализаторов, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° цикличСских зависимостСй ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ JMS Serializer.


Π’Π°ΠΊ ΠΆΠ΅ интСрСсно

L ΠΈΠ· SOLID с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π½Π° PHP

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ подстановки Лисков (Liskov Substitution Principle, LSP) - это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· пяти ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² SOLID, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ гласит, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ замСняСмыми Π½Π°...

DTO β€” Data Transfer Objects

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ/Π΄Π°Π½Π½Ρ‹Π΅ Π²Π°ΠΆΠ½Ρ‹ ΠΊΠ°ΠΊ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ, Ρ‚Π°ΠΊ ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. БохраняйтС Π΅Π΅ простой ΠΈ ясной ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ! Π’Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ простыС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…...