JavaRush /Курстар /All lectures for KY purposes /Сериализация. Башталышы.

Сериализация. Башталышы.

All lectures for KY purposes
Деңгээл , Сабак
жеткиликтүү

— Бүгүн биз объекттерди файлга сактоону жана файлдан окууну талкууладык, туурабы?

— Ооба, биз агымдары колдонуп сактаганбыз, жана дагы агымдардан окуганбыз.

— Жакшы, Амиго. Сенин ушундай майда-чүйдө нерселерди байкаганың кубанычтуу. Кодду жазып, объекттерди файлга сактап, файлдан окууну кошо аласыңбы?

— Эмне жазганыбызды! FileInputStream жана FileOutputStream жарыялап, аларды save & load методдоруна өткөрүүбүз керек. Бул жерде эч нерсе чаташкан жок— баары жөнөкөй.

— Сен үчүн кубанычтамын. Анда жаңы тема — сериализация.

Сериализация биздин жасаган нерсебизге окшош, бирок ал Java-машинанын ичинде түз орнотулган жана абдан сонун. Java-машина объекттерин сактап, кайра жүктөй алат. Буга save & load методдордун кереги жок: бардык объекттер Java-машинанын ичинде сакталган, жана ал аларга толук мүмкүнчүлүккө ээ.

Биз жөн гана объектти алабыз жана агымга сактайбыз/агымдан окуйбуз:

Код
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //save cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //load cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

— Жана бүттүбү?

— Ооба. Сериализациянын чоң жана татаал механизми бар, ал агымга сактоо жана агымдан окуу дээрлик бардык маалымат түрлөрүн колдойт.

— Дээрлик бардыгы, демек бардыгы эмеспи?

— Ооба, маселе мынада: бардык объекттерди сактоо мүмкүн эмес. Айрым объекттер бардык маалыматтарын өздөрүндө сактабайт, алар жөн гана башка объекттерге жана/же маалымат булактарына шилтеме берет. Мисалы, консоль (System.in), агым ввода (InputStream), же башка бир нерсе.

Ошондуктан, Java иштеп чыгуучулары белгилүү бир интерфейс-маркер ойлоп табышты — Serializable. Аны маркер деп аташат, анткени ал эч кандай маалыматтарды же методдорду камтыбайт. Ал класстарды «белгилөө» үчүн гана колдонулат. Эгерде биздин классты бардык маалыматтарын өзүндө сактоочу деп эсептесек, анда биз аны ушул маркер менен белгилей алабыз — implements Serializable деп жазабыз.

Сериализацияны колдогон "мышыктын" мисалы:

Код
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

Биз кайсы бир объектти сериализациялоого (сактоого) аракет кылганда, Java-машинасы ал сериализацияны колдойбу — Serializable интерфейсин ишке ашырабызбы — текшерет. Эгерде ооба, анда ал объектти сактайт, эгерде жок болсо — сериализация мүмкүн эмес деген ката чыгарат.
Бул жерде сериализациялануучу объект да сериализациялануучу объекттерден гана турушу керек экенин түшүнүү керек.

— Ооба, муну күтсө болот эле. Бир нерсени бүтүн сактоо мүмкүн эмес, эгерде анын кандайдыр-бир бөлүктөрү сакталбаса.

— Дал ошондой.

— Демек, int, String, ArrayList типтери кандай болот?

— Алардын баары сериализацияны колдойт, бул тууралуу Java иштеп чыгуучулары атайын кам көрүшкөн. Бул жерде көйгөй болбошу керек.

Кошумчалай кетсек, объект сериализацияланганда анын түрү сакталат. Эми Object типиндеги класс үчүн переменнага Cat объектисинин шилтемесин сактоого болот, жана бул баары сонун сериализацияланып жана десериализацияланып калат.

— Десериализацияланат?

Десериализация — бул сериализацияга каршы процесс деп аталат — агымдан/файлдан окуу жана объекттерди калыбына келтирүү.

— Анда суроолор жок.

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION