מבוא לקריו

1. סקירה כללית

Kryo היא מסגרת סידור Java עם דגש על מהירות, יעילות ו- API ידידותי למשתמש.

במאמר זה נחקור את התכונות העיקריות של מסגרת הקריו וניישם דוגמאות כדי להציג את יכולותיה.

2. תלות של Maven

הדבר הראשון שעלינו לעשות הוא להוסיף את קריו תלות שלנו pom.xml:

 com.esotericsoftware kryo 4.0.1 

את הגרסה האחרונה של חפץ זה תוכלו למצוא ב- Maven Central.

3. יסודות קריו

נתחיל בבדיקת האופן שבו Kryo עובד וכיצד אנו יכולים לסדר אובייקטים באמצעות סדרת סדר ולערוך מחדש.

3.1. מבוא

המסגרת מספקת את קריו הכיתה כנקודת הכניסה העיקרית על כל הפונקציונליות שלה.

מחלקה זו מתזמנת את תהליך הסידור וממפה שיעורים אל Serializer מקרים המטפלים בפרטי המרת גרף של אובייקט לייצוג בתים.

לאחר שהבתים מוכנים, הם נכתבים לזרם באמצעות תְפוּקָה לְהִתְנַגֵד. בדרך זו ניתן לאחסן אותם בקובץ, בבסיס נתונים או להעביר אותם ברשת.

מאוחר יותר, כאשר יש צורך באובייקט, קֶלֶט מופע משמש לקריאת בתים אלה ולפענוחם לאובייקטים של Java.

3.2. סידור אובייקטים

לפני שנצלול לדוגמאות, בואו ניצור תחילה שיטת שירות לאתחל כמה משתנים שנשתמש בהם לכל מקרה מבחן במאמר זה:

@ לפני init בטל פומבי () {kryo = קריו חדש (); פלט = פלט חדש (FileOutputStream חדש ("file.dat")); קלט = קלט חדש (FileInputStream חדש ("file.dat")); }

כעת נוכל לראות כמה קל לכתוב ולקרוא אובייקט באמצעות Kryo:

@ מבחן ציבורי בטל givenObject_whenSerializing_thenReadCorrectly () {Object someObject = "מחרוזת כלשהי"; kryo.writeClassAndObject (פלט, someObject); output.close (); התנגד ל- theObject = kryo.readClassAndObject (קלט); input.close (); assertEquals (האובייקט, "מחרוזת כלשהי"); }

שימו לב לשיחה אל סגור() שיטה. זה נחוץ מאז תְפוּקָה ו קֶלֶט שיעורים יורשים מ OutputStream ו InputStream בהתאמה.

סדרת מספר עצמים היא פשוטה באופן דומה:

@ מבחן חלל ציבורי givenObjects_whenSerializing_thenReadCorrectly () {String someString = "אובייקטים מרובים"; תאריך someDate = תאריך חדש (915170400000L); kryo.writeObject (פלט, someString); kryo.writeObject (פלט, someDate); output.close (); מחרוזת readString = kryo.readObject (קלט, String.class); תאריך readDate = kryo.readObject (קלט, Date.class); input.close (); assertEquals (readString, "אובייקטים מרובים"); assertEquals (readDate.getTime (), 915170400000L); }

שימו לב שאנחנו מעבירים את הכיתה המתאימה ל readObject () שיטה, זה הופך את הקוד שלנו ללא יציקות.

4. סדרנים

בחלק זה נראה איזה סדרנים כבר זמינים ואז ניצור משלנו.

4.1. ברירת מחדל של Serializers

כאשר Kryo מסדר אובייקט, הוא יוצר מופע של רשום בעבר Serializer בכיתה לבצע את ההמרה לבתים. אלה נקראים סדרות ברירת מחדל וניתן להשתמש בהם ללא כל התקנה מצדנו.

הספרייה כבר מספקת מספר סידורי רשימות כאלה המעבדים פרימיטיביים, רשימות, מפות, enums וכו '. אם לא נמצא סידורי סדר בכיתה נתונה, אז FieldSerializer משמש, אשר יכול להתמודד עם כמעט כל סוג של אובייקט.

בואו נראה איך זה נראה. ראשית, בואו 'ליצור a אדם מעמד:

אדם בכיתה ציבורית {private String name = "John Doe"; גיל פרטי פרטי = 18; תאריך לידה פרטי פרטי = תאריך חדש (933191282821L); // בונים סטנדרטיים, גטרים וקובעים}

עכשיו בואו נכתוב אובייקט מהשיעור הזה ואז נקרא אותו בחזרה:

@ מבחן בטל פומבי שניתןPerson_whenSerializing_thenReadCorrectly () {אדם אדם = אדם חדש (); kryo.writeObject (פלט, אדם); output.close (); אדם readPerson = kryo.readObject (קלט, Person.class); input.close (); assertEquals (readPerson.getName (), "John Doe"); }

שימו לב שלא היינו צריכים לציין שום דבר לסידור א אדם חפץ מאז א FieldSerializer נוצר אוטומטית עבורנו.

4.2. סדרנים מותאמים אישית

אם אנו זקוקים לשליטה רבה יותר בתהליך הסידור, יש לנו שתי אפשרויות; אנחנו יכולים לכתוב בעצמנו Serializer בכיתה ורשמו אותה בקריו או תנו לכיתה לטפל בסידור בפני עצמו.

כדי להדגים את האפשרות הראשונה, בואו ניצור מחלקה שמתארכת Serializer:

מחלקה ציבורית PersonSerializer מרחיבה את Serializer {public void write (Kryo kryo, Output output, Person object) {output.writeString (object.getName ()); output.writeLong (object.getBirthDate (). getTime ()); } אדם ציבורי נקרא (Kryo kryo, קלט קלט, סוג מחלקה) {אדם אדם = אדם חדש (); person.setName (input.readString ()); לידה ארוכה = input.readLong (); person.setBirthDate (תאריך חדש (birthDate)); person.setAge (calcAge (birthDate)); אדם חוזר; } int intelactive private (long birthDate) {// איזו הגיון מותאם אישית מחזיר 18; }}

עכשיו, בואו נבדוק את זה:

@ מבחן חלל ציבורי givenPerson_whenUsingCustomSerializer_thenReadCorrectly () {אדם אדם = אדם חדש (); person.setAge (0); kryo.register (Person.class, PersonSerializer חדש ()); kryo.writeObject (פלט, אדם); output.close (); אדם readPerson = kryo.readObject (קלט, Person.class); input.close (); assertEquals (readPerson.getName (), "John Doe"); assertEquals (readPerson.getAge (), 18); }

שימו לב שה- גיל שדה שווה ל 18, למרות שקבענו אותו בעבר ל 0.

אנחנו יכולים גם להשתמש ב- @DefaultSerializer ביאור להודיע ​​לקריו שאנחנו רוצים להשתמש ב- PersonSerializer בכל פעם שהוא צריך להתמודד עם א אדם לְהִתְנַגֵד. זה עוזר למנוע את השיחה אל להירשם() שיטה:

@DefaultSerializer (PersonSerializer.class) אדם בכיתה ציבורית מיישם KryoSerializable {// ...}

באפשרות השנייה, בואו לשנות את שלנו אדם בכיתה להרחיב את ניתן לשנות את הקריאו מִמְשָׁק:

אדם בכיתה ציבורית מיישם את KryoSerializable {// ... כתיבת חלל ציבורי (Kryo kryo, פלט פלט) {output.writeString (שם); // ...} קריאה בטלנית ציבורית (Kryo kryo, קלט קלט) {name = input.readString (); // ...}}

מכיוון שמקרה הבדיקה של אפשרות זו שווה לקודם, אינו נכלל כאן. עם זאת, תוכל למצוא אותו בקוד המקור של מאמר זה.

4.3. Java Serializer

במקרים ספורדיים, קריו לא יוכל לסדר כיתה. אם זה קורה, וכתיבת סידורי Serial מותאמת אישית אינה אפשרות, אנו יכולים להשתמש במנגנון הסידור הרגיל של Java באמצעות JavaSerializer. זה דורש שהכיתה תיישם את ניתן לבצע סדרתי ממשק כרגיל.

להלן דוגמה המשתמשת בסדרת הסידורי הנ"ל:

מחלקה ציבורית מיישמת את ComplexObject Serializable {private String name = "Bael"; // סטרים וקובעים סטנדרטיים}
@ מבחן חלל ציבורי שניתן JavaSerializable_whenSerializing_thenReadCorrectly () {ComplexClass complexObject = ComplexClass חדש (); kryo.register (ComplexClass.class, JavaSerializer חדש ()); kryo.writeObject (פלט, complexObject); output.close (); ComplexClass readComplexObject = kryo.readObject (קלט, ComplexClass.class); input.close (); assertEquals (readComplexObject.getName (), "Bael"); }

5. מסקנה

במדריך זה חקרנו את המאפיינים הבולטים ביותר בספריית Kryo.

סדרנו מספר עצמים פשוטים והשתמשנו ב- FieldSerializer בכיתה להתמודד עם אחד מותאם אישית. יצרנו גם סידור מותאם אישית והדגמנו כיצד ניתן לחזור למנגנון הסידור הסטנדרטי של Java במידת הצורך.

כמו תמיד, קוד המקור השלם למאמר זה ניתן למצוא באתר Github.


$config[zx-auto] not found$config[zx-overlay] not found