ในประชุมอัปเดตโปรเจกต์ล่าสุด ทีมของผมพูดถึงว่าจะใช้ Serialization ส่งข้อมูลไปมาระหว่างแอปพลิเคชันอย่างไร
วิศวกรคนหนึ่งที่อยากเข้าสู่โปรเจกต์ซอฟต์แวร์มากขึ้น บอกผมว่าไม่คุ้นเคยกับคำศัพท์นี้
ง่ายที่จะพลาดกระบวนการสำคัญแบบนี้ที่ไม่ขึ้นมาจนกว่าจะเจาะลึกลงไปในโปรเจกต์ใหญ่ๆ กรณีนี้ตรงกันข้ามกับคนนั้น และผมก็เคยเป็นแบบนั้น
เพราะฉะนั้นผมอยากเขียนเกี่ยวกับมัน ผมช่วยเพื่อนร่วมงานเข้าใจ Serialization วันนั้น และวันนี้คุณจะได้เรียนรู้
Serialization คืออะไร?
Serialization คือกระบวนการที่ Service หนึ่งรับ Data Structure (เช่น Dictionary ใน Python) ห่อหุ้มมัน และส่งไปยัง Service อีกตัวเพื่ออ่าน นี่คือความหมายง่ายๆ
ลองจินตนาการ: ผมต้องส่งข้อความให้ใครเขียนข้อความบน Puzzle ที่ประกอบเสร็จแล้ว แล้วผมแยกชิ้นส่วน เพิ่มคำแนะนำการประกอบใหม่ และส่งไป
ผู้รับได้ชิ้นส่วน Puzzle ประกอบกลับคืนเดิม ตอนนี้พวกเขามีข้อความของผม

Technical Definition น่าสนใจกว่า: Serialization คือกระบวนการแปลง Data Object ให้เป็น Byte Stream และบันทึก State ของ Object เพื่อเก็บบน Disk หรือส่งผ่าน Network ทำให้ Storage Size ลดลง และโอนข้อมูลผ่าน Network ง่ายขึ้น

Marshaling และ Serialization - ต่างกันยังไง?
กระบวนการ Marshaling อาจ浮上ในใจ Marshaling คือกระบวนการแปลง Memory Representation ของ Object ให้อยู่ในรูปแบบที่เหมาะสมสำหการส่ง
แม้ Marshaling และ Serialization จะ คล้ายคลึง แต่มีความแตกต่างสำคัญ ตัวอย่าง สร้างโปรแกรม Golang อ่าน JSON เข้า Golang Data Structure อาจใช้ Marshaling แปลง JSON Key Values เป็น Golang Key Values
ความแตกต่างคือ Marshaling อาจใช้แปลงข้อมูล (Translate) ในขณะที่ Serialization ส่ง/เก็บข้อมูลใน Byte Stream และประกอบกลับคืนรูปแบบเดิม ทั้งคู่ทำ Serialization แต่ Intent ต่างกัน
ดู Struct ที่ผมสร้างสำหโต้ตอบ Twitter Data ด้านล่าง ตัวอย่าง Marshaling ใน Golang ให้ Hints เรียก Tags แปลง Object นี้เป็น JSON Data ด้วย Built-in Marshaling Service ของ Golang ได้ง่าย

Endianness คืออะไร?
อยากกล่าวถึง Endianness แบบสั้นๆ Endianness คือ術語อธิบาย Byte Order ใน Memory
คิดว่า Memory เป็น Block เก็บ Bits ของ Data สำห Serialization ให้ทำงาน Byte Stream ต้องโอน Data Types ไม่ว่าจะ Endianness จะเปลี่ยนจากระบบหนึ่งไปอีกระบบหนึ่ง
ดู Little และ Big-endian Differences ด้านล่าง สำคัญที่ Endianness ต้องตรงกันระหว่างระบบ หรือแปลงได้ เพราะไม่ใช่ทุกระบบจัดเรียง Bits แบบเดียวกัน

Use Cases สำห Serialization
Use Case ของเราใช้ประโยชน์จาก Features เหล่านี้เต็มที่ เราวางแผนรับข้อมูลจาก Hardware ที่ Scan ห่อหุ้มข้อมูลเป็น Byte Stream ส่งผ่าน Network ไป Service อีกตัว Reconstruct Data
กระบวนการย้อนกลับ Serialization และ Reconstruct Data กลับสู่รูปแบบเดิม เรียกว่า Deserialization
มี Use Cases อื่นๆ เช่น REST APIs หรือ Messaging Protocols อย่าง AMQP ใช้ Serialization Compress และส่งข้อมูล
AMQP คือ Messaging Protocol ส่ง Messages ไป AMQP Broker Receiving Service "Listen" Broker นี้รอ Message Backend Engineers อาจรู้จักดี ใช้ส่งข้อมูลไปมาระหว่าง Distributed Systems บ่อย
ภาษาเขียนโปรแกรมหลายภาษารองรับ Spin up Serialization ได้ง่าย จึงเป็นหัวข้อ Language-agnostic
Serialization Example
ตัวอย่างเร็ว โค้ดนี้ใช้ Library Kombu ส่ง Messages ผ่าน AMQP ใช้ส่ง Messages จาก Software Package หนึ่งไปอีกตัวผ่าน Network โค้ดสำห Service ส่ง Message ไป AMQP Broker:
def send_message(self, payload, sender_serializer):
...
try:
producer.publish(
{'payload': message},
...
serializer='json',
...
)
return
สังเกต Method publish เราส่ง Serialization Method เป็น Argument ให้ Library รู้ว่าจะ Serialize Data ที่ส่งอย่างไร
Data Message แปลงเป็น Byte Stream ถ้าดูจะเหมือน String ยาวของตัวอักษรและตัวเลข ส่ง Message ไป
Service ตรงข้ามใช้ Serialization Method เดียวกัน Reconstruct Data กลับสู่ Original State นี่คือ Feature สำคัญ เพราะเราสร้าง Suite of Tools ที่ต้องส่ง Messages ไปมาระหว่างกันเพื่อให้ทำงาน
Serialization Data Formats
ผมใช้ JSON สำห Serialization ทุกครั้งที่ Task ต้องการ แต่ก็ใช้ได้อื่นๆ อีก
JSON มี Overhead มากแต่ Human Readability ทำให้เหมาะกับผม สามารถใช้ Protobufs, YAML, XML ได้ด้วย นี่คือบาง Data Object Formats ที่ใช้ได้
สรุป
ผมดีใจที่เขียนจบเรื่องนี้ หยุดคิดเรื่องนี้ได้ และหวังว่ามישהו เรียนรู้อะไรบางอย่างจากมัน
Serialization กลายเป็นสิ่งจำเป็นตอนประกอบ Communication Pipeline ดีที่จะรู้เรื่องนี้ เพื่อเข้าใกล้ Tool ใดๆ ที่ใช้ พร้อม Background Knowledge ที่เหมาะสม
-George