0Pricing
Java Academy · บทเรียน

ทางเลือกสมัยใหม่: JSON และ Protocol Buffers

แทนที่การทำซีเรียลไลซ์ของ Java ด้วย JSON จาก Jackson และ Protocol Buffers เพื่อการจัดเก็บที่พกพาได้และปลอดภัย

ทางเลือกสมัยใหม่: JSON และ Protocol Buffers เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงควรแทนที่การซีเรียลไลซ์ของ Java

การซีเรียลไลซ์ของ Java ใช้ได้เฉพาะบน JVM มีข้อมูลเกินจำเป็น ทำงานช้า และมีความเสี่ยงด้านความปลอดภัย แอปพลิเคชันสมัยใหม่มักเลือกใช้ JSON ซึ่งมนุษย์อ่านได้และไม่ขึ้นกับภาษา หรือ Protocol Buffers ซึ่งกะทัดรัด ใช้สคีมาเป็นตัวขับเคลื่อน และทำงานรวดเร็ว

Jackson: ไลบรารี JSON ที่เป็นมาตรฐานโดยพฤตินัย

ObjectMapper ของ Jackson แปลงอ็อบเจ็กต์เป็นสตริง JSON และแปลงกลับได้ ให้เพิ่ม com.fasterxml.jackson.core:jackson-databind ลงในโปรเจกต์ของคุณ

ObjectMapper mapper = new ObjectMapper();
User user = new User("Alice", 30);
String json = mapper.writeValueAsString(user);
System.out.println(json); // {"name":"Alice","age":30}
User restored = mapper.readValue(json, User.class);

การปรับแต่ง Jackson ด้วยคำอธิบายประกอบ

ใช้ @JsonProperty, @JsonIgnore, @JsonAlias และ @JsonFormat เพื่อควบคุมการซีเรียลไลซ์โดยไม่ต้องเปลี่ยนชื่อฟิลด์ในโมเดล

public class Product {
    @JsonProperty("product_name")
    private String name;
    @JsonIgnore
    private String internalCode;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate releaseDate;
}

โมดูล Jackson: รองรับเวลาของ Java

ลงทะเบียน JavaTimeModule เพื่อซีเรียลไลซ์ LocalDate, LocalDateTime และ Instant ได้อย่างถูกต้อง แทนที่จะได้อ็อบเจ็กต์ JSON ที่เต็มไปด้วยฟิลด์

ObjectMapper mapper = new ObjectMapper()
    .registerModule(new JavaTimeModule())
    .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String json = mapper.writeValueAsString(LocalDate.now());
System.out.println(json); // "2024-06-15"

GSON เป็นทางเลือกที่มีน้ำหนักเบา

GSON จาก Google เรียบง่ายกว่า Jackson โดยไม่ต้องกำหนดค่าสำหรับชนิดข้อมูลพื้นฐาน แต่มีคำอธิบายประกอบที่หลากหลายและประสิทธิภาพในระดับใหญ่ไม่เทียบเท่า Jackson

Gson gson = new Gson();
String json = gson.toJson(new User("Bob", 25));
User user = gson.fromJson(json, User.class);

Protocol Buffers คืออะไร

Protocol Buffers (Protobuf) คือรูปแบบการซีเรียลไลซ์แบบไบนารีของ Google คุณกำหนดสคีมา .proto คอมไพล์เป็นคลาส Java แล้วจะได้ข้อความที่กะทัดรัดพร้อมการกำหนดเวอร์ชันในตัว

// user.proto
syntax = "proto3";
message UserProto {
    string name = 1;
    int32  age  = 2;
}

การเข้ารหัสข้อความ Protobuf

คลาสที่สร้างขึ้นจะมี API สำหรับสร้างอ็อบเจ็กต์ เรียกใช้ toByteArray() เพื่อรับข้อมูลไบนารี และใช้ parseFrom(bytes) เพื่อถอดรหัส

UserProto user = UserProto.newBuilder()
    .setName("Alice")
    .setAge(30)
    .build();
byte[] bytes = user.toByteArray();
UserProto restored = UserProto.parseFrom(bytes);
System.out.println(restored.getName());

ข้อแลกเปลี่ยนระหว่าง JSON กับ Protobuf

JSON มนุษย์อ่านได้และไม่ต้องมีสคีมา ส่วน Protobuf มีขนาดเล็กลง 3–10 เท่าและทำงานเร็วกว่า แต่ต้องใช้สคีมาและการสร้างโค้ด เลือก JSON สำหรับ REST API และ Protobuf สำหรับบริการภายในที่มีปริมาณงานสูง

วิวัฒนาการของสคีมาด้วย Protobuf

ฟิลด์ของ Protobuf มีหมายเลขกำกับ ไม่ได้ระบุด้วยชื่อ คุณสามารถเพิ่มฟิลด์ใหม่หรือเลิกใช้ฟิลด์เก่าได้อย่างปลอดภัยโดยไม่ทำให้ไคลเอนต์เดิมเสียหาย ตราบใดที่ไม่ใช้หมายเลขฟิลด์ซ้ำ

// v2 of user.proto — backwards compatible
message UserProto {
    string name  = 1;
    int32  age   = 2;
    string email = 3; // new in v2
}

การย้ายจากการซีเรียลไลซ์ของ Java

แทนที่เส้นทางการเขียนที่ใช้ ObjectOutputStream ด้วย ObjectMapper.writeValue() หรือ Protobuf writeTo() เก็บการซีเรียลไลซ์แบบเดิมไว้เฉพาะสำหรับการย้ายข้อมูลเก่า

ความปลอดภัย: ไม่มีแก็ดเจ็ตสำหรับการดีซีเรียลไลซ์

JSON และ Protobuf จะไม่เรียกใช้คอนสตรักเตอร์หรือเมธอดโดยพลการระหว่างการดีซีเรียลไลซ์ จึงกำจัดการโจมตีแบบห่วงโซ่แก็ดเจ็ตที่สร้างปัญหาให้การซีเรียลไลซ์ของ Java

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ข้อได้เปรียบสำคัญของ Protocol Buffers เหนือ JSON คืออะไร

สรุปทบทวน

แทนที่การซีเรียลไลซ์ของ Java ด้วย JSON ของ Jackson สำหรับ REST หรือความสามารถในการอ่านโดยมนุษย์ หรือใช้ Protocol Buffers สำหรับบริการที่ต้องการประสิทธิภาพสูง ทั้งสองรูปแบบใช้ข้ามภาษาได้ รองรับการพัฒนาสคีมา และมีความปลอดภัยตั้งแต่การออกแบบ

คำถามที่พบบ่อย

บทเรียน “ทางเลือกสมัยใหม่: JSON และ Protocol Buffers” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ทางเลือกสมัยใหม่: JSON และ Protocol Buffers” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ทางเลือกสมัยใหม่: JSON และ Protocol Buffers”

แทนที่การทำซีเรียลไลซ์ของ Java ด้วย JSON จาก Jackson และ Protocol Buffers เพื่อการจัดเก็บที่พกพาได้และปลอดภัย คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ทางเลือกสมัยใหม่: JSON และ Protocol Buffers” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานการทำซีเรียลไลซ์ของ Java
  2. ฟิลด์ transient และ serialVersionUID
  3. การทำซีเรียลไลซ์แบบกำหนดเอง: writeObject และ readObject
  4. ทางเลือกสมัยใหม่: JSON และ Protocol Buffers
← กลับไปที่ Java Academy