ทางเลือกสมัยใหม่: 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานการทำซีเรียลไลซ์ของ Java
- ฟิลด์ transient และ serialVersionUID
- การทำซีเรียลไลซ์แบบกำหนดเอง: writeObject และ readObject
- ทางเลือกสมัยใหม่: JSON และ Protocol Buffers