Сериализация объектов
Маркерный интерфейс Serializable
Объектный поток вывода
Класс ObjectOutputStream
Объектный поток ввода
Класс ObjectInputStream
Сериализуемый класс
Сериализация
Десериализация
Десериализация
Сериализуемый класс со ссылкой
Сериализация
Сериализация
Десериализация
Несериализуемые поля
Класс с несериализуемым полем
Сериализация
Десериализация
UID
Получение UID
serialVersionUID
Класс с serialVersionUID
Сериализация
Новый класс со старым serialVersionUID
Десериализация
readObject и writeObject
Класс реализующий список с помощью массива
Сериализация
Десериализация
957.95K
Категория: ПрограммированиеПрограммирование

Ввод - вывод. Сериализация

1.

2.

V. Ввод - вывод
5. Сериализация
2

3. Сериализация объектов

Java предоставляет механизм называемый сериализацией объектов для
представления объекта в виде последовательности байтов которая включает
данные объекта, а также информацию о типе объекта и типах данных хранящихся в
объекте. Сериализованный объект может быть записан в файл. После
сериализации и записи объекта в файл он может быть прочитан из файла и
десериализован. Вместе с объектом могут сериализоваться и десериализоваться
все зависимые объекты. Для того чтобы объект класса можно было сериализовать
и десериализовать необходимо чтобы класс реализовывал маркерный интерфейс
Serializable. При десериализации объекта конструктор не вызывается.
Классы ObjectInputStream и ObjectOutputStream - высокоуровневые потоки которые
содержат методы для сериализации и десериализации объектов.
3

4. Маркерный интерфейс Serializable

Шаблон Хранитель: Существует вариант реализации
шаблона хранитель с помощью сериализации.
package
package java.io;
java.io;
public
public interface
interface Serializable
Serializable {{
}}
I
Интерфейс Serializable должны реализовывать все классы предназначенные
для сериализации. Это маркерный интерфейс - он не содержит ни одного
метода.
4

5. Объектный поток вывода

5

6. Класс ObjectOutputStream

package
package java.io;
java.io;
public
public class
class ObjectOutputStream
ObjectOutputStream extends
extends OutputStream
OutputStream implements
implements ObjectOutput,
ObjectOutput, ObjectStreamConstants{
ObjectStreamConstants{
out)
public
out)
public ObjectOutputStream(OutputStream
ObjectOutputStream(OutputStream out
out
))
public
public void
void writeObject(Object
writeObject(Object obj)
obj)
}}
public
public
public
public
public
public
void
void
void
void
void
void
write(int
write(int b)
b)
write(byte
write(byte b[])
b[])
write(byte
write(byte b[],
b[], int
int off,
off, int
int len)
len)
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
void
writeBoolean(boolean
writeBoolean(boolean v)
v)
writeByte(int
v)
writeByte(int v)
writeShort(int
writeShort(int v)
v)
writeChar(int
writeChar(int v)
v)
writeInt(int
writeInt(int v)
v)
writeLong(long
writeLong(long v)
v)
writeFloat(float
writeFloat(float v)
v)
writeDouble(double
writeDouble(double v)
v)
public
public
public
public
public
public
final
final
final
final
final
final
void
void
void
void
void
void
writeBytes(String
writeBytes(String s)
s)
writeChars(String
writeChars(String s)
s)
writeUTF(String
str)
writeUTF(String str)
public
public void
void flush()
flush()
public
public void
void close()
close()
C
Класс ObjectOutputStream – высокоуровневый объектный поток содержащий метод для сериализации объектов.
Он предназначен для превращения объектов в последовательность байтов и запись этой последовательности в
байтовый поток вывода. Байтовый поток вывода задаётся в конструкторе. Класс также содержит методы для
записи примитивов.
6

7. Объектный поток ввода

7

8. Класс ObjectInputStream

package
package java.io;
java.io;
public
public class
class ObjectInputStream
ObjectInputStream extends
extends InputStream
InputStream implements
implements ObjectInput,
ObjectInput, ObjectStreamConstants
ObjectStreamConstants {{
public
public ObjectInputStream(InputStream
ObjectInputStream(InputStream in)
in)
public
final
Object
readObject()
public final
final Object
Object readObject()
readObject()
public
public
final
Object
readObject()
public
public int
int read()
read()
public
public int
int read(byte
read(byte b[],
b[], int
int off,
off, int
int len)
len)
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
public
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
final
boolean
boolean readBoolean()
readBoolean()
byte
byte readByte()
readByte()
short
short readShort()
readShort()
int
readInt()
int readInt()
long
long readLong()
readLong()
float
float readFloat()
readFloat()
double
double readDouble()
readDouble()
String
readUTF()
String readUTF()
}}
C
Класс ObjectInputStream высокоуровневый объектный поток содержащий метод для десериализации объектов.
Предназначен для превращения последовательности байтов считанной из байтового потока ввода в объект.
Байтовый поток ввода задаётся в конструкторе. Также содержит методы для чтения примитивов.
8

9.

Сериализация и десериализация
одного объекта
9

10. Сериализуемый класс

class
class Employee
Employee implements
implements Serializable
Serializable {{
public
public Employee()
Employee() {{
System.out.println("Employee
System.out.println("Employee object
object is
is being
being created
created using
using aa default
default constructor");
constructor");
}}
public
public Employee(String
Employee(String name,
name, short
short yearOfBirth,
yearOfBirth, char
char gender,
gender,
boolean
boolean isMarried,
isMarried, int
int salary)
salary) {{
this.name
this.name == name;
name;
this.yearOfBirth
this.yearOfBirth == yearOfBirth;
yearOfBirth;
this.gender
this.gender == gender;
gender;
this.isMarried
this.isMarried == isMarried;
isMarried;
this.salary
this.salary == salary;
salary;
}}
numEmployees++;
numEmployees++;
System.out.println("Employee
System.out.println("Employee object
object is
is being
being created
created using
using aa constructor");
constructor");
public
public String
String toString()
toString() {{
return
return "Employee
"Employee [name="
[name=" ++ name
name ++ ",
", yearOfBirth="
yearOfBirth=" ++ yearOfBirth
yearOfBirth
++ ",
", gender="
gender=" ++ gender
gender ++ ",
", isMarried="
isMarried=" ++ isMarried
isMarried ++ ",
", salary="
salary="
++ salary
salary ++ "]";
"]";
}}
public
public static
static int
int getNumEmployees(){
getNumEmployees(){
return
return numEmployees;
numEmployees;
}}
private
private
private
private
private
private
private
private
private
private
}}
String
String name;
name;
short
yearOfBirth;
short yearOfBirth;
char
char gender;
gender;
boolean
boolean isMarried;
isMarried;
int
int salary;
salary;
private
private static
static int
int numEmployees
numEmployees == 0;
0;
10

11. Сериализация

public
public class
class ObjectOutputDemo
ObjectOutputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Employee
Employee bob
bob == new
new Employee("Robert",
Employee("Robert", (short)
(short) 1987,
1987, 'M',
'M', true,
true, 30000);
30000);
System.out.println(bob);
System.out.println(bob);
System.out.println("Total
System.out.println("Total number
number of
of employees:
employees: "" ++ Employee.getNumEmployees());
Employee.getNumEmployees());
FileOutputStream
FileOutputStream fos
fos == null;
null;
ObjectOutputStream
ObjectOutputStream oos
oos == null;
null;
try
try {{
fos
fos == new
new FileOutputStream("I:\\FileIO\\employee.dat");
FileOutputStream("I:\\FileIO\\employee.dat");
oos
=
new
ObjectOutputStream(fos);
oos = new ObjectOutputStream(fos);
oos.writeObject(bob);
oos.writeObject(bob);
System.out.println("Employee
System.out.println("Employee object
object was
was serialized");
serialized");
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (oos
(oos !=
!= null)
null)
oos.close();
oos.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
Employee
Employee object
object is
is being
being created
created using
using aa constructor
constructor
Employee
Employee [name=Robert,
[name=Robert, yearOfBirth=1987,
yearOfBirth=1987, gender=M,
gender=M, isMarried=true,
isMarried=true, salary=30000]
salary=30000]
Total
number
of
employees:
1
Total number of employees: 1
Employee
Employee object
object was
was serialized
serialized
11

12. Десериализация

class
class ObjectInputDemo
ObjectInputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
FileInputStream
FileInputStream fis
fis == null;
null;
ObjectInputStream
ObjectInputStream ois
ois == null;
null;
try
try {{
fis
fis == new
new FileInputStream("I:\\FileIO\\employee.dat");
FileInputStream("I:\\FileIO\\employee.dat");
ois
ois == new
new ObjectInputStream(fis);
ObjectInputStream(fis);
Employee
Employee emp
emp == (Employee)
(Employee)
System.out.println(emp);
System.out.println(emp);
System.out.println("Total
System.out.println("Total
}}
}}
ois.readObject();
ois.readObject();
number
number of
of employees:
employees: "" ++ Employee.getNumEmployees());
Employee.getNumEmployees());
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} catch
(ClassNotFoundException
e)
{
catch (ClassNotFoundException e) {
System.out.println("Class
System.out.println("Class was
was not
not found");
found");
}}
finally
finally {{
try
try {{
if
if (ois
(ois !=
!= null)
null)
ois.close();
ois.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
Employee
Employee [name=Robert,
[name=Robert, yearOfBirth=1987,
yearOfBirth=1987, gender=M,
gender=M, isMarried=true,
isMarried=true, salary=30000]
salary=30000]
Total
Total number
number of
of employees:
employees: 00
12

13. Десериализация

При десериализации объекта конструктор класса не вызывается. Статические
поля класса не сериализуются и не десериализуются.
13

14.

Сериализация графа объектов
14

15. Сериализуемый класс со ссылкой

public
public class
class Person
Person implements
implements Serializable{
Serializable{
public
public Person(String
Person(String name)
name) {{
this.name
this.name == name;
name;
System.out.println("Person
System.out.println("Person constructor
constructor is
is called,
called, name="
name=" ++ name);
name);
}}
public
public Person()
Person() {{
this.name
this.name == "A
"A person";
person";
System.out.println("Person
System.out.println("Person parameterless
parameterless constructor
constructor is
is called,
called, name="
name="
++ name);
name);
}}
public
public String
String getName()
getName() {{
return
return name;
name;
}}
public
public void
void setSpouse(Person
setSpouse(Person value)
value) {{
spouse
spouse == value;
value;
}}
public
public Person
Person getSpouse()
getSpouse() {{
return
return spouse;
spouse;
}}
public
public String
String toString()
toString() {{
return
return "[Person:
"[Person: name="
name=" ++ name
name ++ "" spouse="
spouse=" ++ spouse.getName()
spouse.getName() ++ "]";
"]";
}}
}}
private
private
private
private
String
String
Person
Person
name;
name;
spouse;
spouse;
15

16. Сериализация

public
public class
class TwoObjectsOutputDemo
TwoObjectsOutputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Person
Person ann
ann == new
new Person("Ann");
Person("Ann");
Person
bob
=
new
Person("Bob");
Person bob = new Person("Bob");
ann.setSpouse(bob);
ann.setSpouse(bob);
bob.setSpouse(ann);
bob.setSpouse(ann);
System.out.println(ann);
System.out.println(ann);
System.out.println(bob);
System.out.println(bob);
FileOutputStream
FileOutputStream fos
fos == null;
null;
ObjectOutputStream
ObjectOutputStream oos
oos == null;
null;
try
try {{
fos
fos == new
new FileOutputStream("I:\\FileIO\\person.dat");
FileOutputStream("I:\\FileIO\\person.dat");
oos
oos == new
new ObjectOutputStream(fos);
ObjectOutputStream(fos);
oos.writeObject(ann);
oos.writeObject(ann);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (oos
(oos !=
!= null)
null)
oos.close();
oos.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
16

17. Сериализация

Person
Person constructor
constructor is
is called,
called,
Person
constructor
is
called,
Person constructor is called,
[Person:
[Person: name=Ann
name=Ann spouse=Bob]
spouse=Bob]
[Person:
[Person: name=Bob
name=Bob spouse=Ann]
spouse=Ann]
name=Ann
name=Ann
name=Bob
name=Bob
17

18. Десериализация

class
class TwoObjectsInputDemo
TwoObjectsInputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
FileInputStream
FileInputStream fis
fis == null;
null;
ObjectInputStream
ObjectInputStream ois
ois == null;
null;
try
try {{
fis
fis == new
new FileInputStream("I:\\FileIO\\person.dat");
FileInputStream("I:\\FileIO\\person.dat");
ois
ois == new
new ObjectInputStream(fis);
ObjectInputStream(fis);
Person
Person ann
ann == (Person)
(Person) ois.readObject();
ois.readObject();
System.out.println(ann);
System.out.println(ann);
System.out.println(ann.getSpouse());
System.out.println(ann.getSpouse());
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} catch
(ClassNotFoundException
e)
{
catch (ClassNotFoundException e) {
System.out.println("Class
System.out.println("Class was
was not
not found");
found");
}}
finally
finally {{
try
try {{
if
if (ois
(ois !=
!= null)
null)
ois.close();
ois.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
[Person:
[Person: name=Ann
name=Ann spouse=Bob]
spouse=Bob]
[Person:
[Person: name=Bob
name=Bob spouse=Ann]
spouse=Ann]
18

19.

Несериализуемые поля
19

20. Несериализуемые поля

Все поля экземпляра класса независимо от модификатора доступа сериализуются.
Но можно задать сериализацию и десериализацию только части полей класса. Для
этого можно явно указать сериализуемые поля используя serialPersistentFields или
использовать ключевое слово transient для обозначения несериализуемых полей.
20

21. Класс с несериализуемым полем

class
class Salesman
Salesman implements
implements Serializable
Serializable {{
public
public Salesman(String
Salesman(String n,
n, double
double s)
s) {{
name
name == n;
n;
salary
=
salary = s;
s;
}}
public
public String
String getName()
getName() {{
return
return name;
name;
}}
public
public double
double getSalary()
getSalary() {{
return
return salary;
salary;
}}
public
public String
String toString()
toString() {{
return
return getClass().getSimpleName()
getClass().getSimpleName() ++ "[name="
"[name=" ++ name
name ++ ",salary="
",salary=" ++ salary
salary
++ ",bonus="
",bonus=" ++ bonus
bonus ++ "]";
"]";
}}
public
public void
void setBonus(double
setBonus(double bonus)
bonus) {{
this.bonus
this.bonus == bonus;
bonus;
}}
private
private
private
private
}}
String
String
double
double
name;
name;
salary;
salary;
private
private transient
transient double
double bonus;
bonus;
21

22. Сериализация

public
public class
class TransientOutputDemo
TransientOutputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Salesman
Salesman bob
bob == new
new Salesman("Robert",
Salesman("Robert", 30000);
30000);
bob.setBonus(10000);
bob.setBonus(10000);
System.out.println(bob);
System.out.println(bob);
FileOutputStream
FileOutputStream fos
fos == null;
null;
ObjectOutputStream
ObjectOutputStream oos
oos == null;
null;
try
try {{
fos
fos
oos
oos
==
==
new
new
new
new
FileOutputStream("I:\\FileIO\\salesman.dat");
FileOutputStream("I:\\FileIO\\salesman.dat");
ObjectOutputStream(fos);
ObjectOutputStream(fos);
oos.writeObject(bob);
oos.writeObject(bob);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (oos
(oos !=
!= null)
null)
oos.close();
oos.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
bonus=10000.0
Salesman[name=Robert,salary=30000.0,bonus=10000.0
bonus=10000.0 ]]
Salesman[name=Robert,salary=30000.0,bonus=10000.0
22

23. Десериализация

class
class TransientInputDemo
TransientInputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
FileInputStream
FileInputStream fis
fis == null;
null;
ObjectInputStream
ObjectInputStream ois
ois == null;
null;
try
try {{
fis
fis == new
new FileInputStream("I:\\FileIO\\salesman.dat");
FileInputStream("I:\\FileIO\\salesman.dat");
ois
ois == new
new ObjectInputStream(fis);
ObjectInputStream(fis);
Salesman
Salesman bob
bob == (Salesman)
(Salesman) ois.readObject();
ois.readObject();
System.out.println(bob);
System.out.println(bob);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} catch
catch (ClassNotFoundException
(ClassNotFoundException e)
e) {{
System.out.println("Class
System.out.println("Class was
was not
not found");
found");
}}
finally
finally {{
try
try {{
if
if (ois
(ois !=
!= null)
null)
ois.close();
ois.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
bonus=0.0
Salesman[name=Robert,salary=30000.0,bonus=0.0
bonus=0.0 ]]
Salesman[name=Robert,salary=30000.0,bonus=0.0
23

24.

UID
24

25. UID

При сериализации объекта на основе информации о полях и методах класса
создаётся идентификатор UID. Этот идентификатор записывается вместе с
сериализованным объектом. При десериализации проверяется что UID
сериализованного класса совпадает с UID класса. Если они различаются
десериализация невозможна и выбрасывается исключение. UID могут различаться
если после сериализации объекта класса в класс были внесены изменения.
25

26. Получение UID

I:\item>dir
I:\item>dir
Volume
Volume in
in drive
drive II has
has no
no label.
label.
Volume
Volume Serial
Serial Number
Number is
is 44AB-CB89
44AB-CB89
Directory
Directory of
of I:\item
I:\item
02/21/2013
02/21/2013
02/21/2013
02/21/2013
02/21/2013
02/21/2013
12:14
<DIR>
..
12:14 PM
PM
<DIR>
12:14
<DIR>
..
12:14 PM
PM
<DIR>
..
12:11
476
12:11 PM
PM
476 ItemUID.java
ItemUID.java
11 File(s)
476
File(s)
476 bytes
bytes
22 Dir(s)
48,619,651,072
bytes
Dir(s) 48,619,651,072 bytes free
free
I:\item>javac
I:\item>javac ItemUID.java
ItemUID.java
I:\item>dir
I:\item>dir
Volume
Volume in
in drive
drive II has
has no
no label.
label.
Volume
Serial
Number
is
44AB-CB89
Volume Serial Number is 44AB-CB89
Directory
Directory of
of I:\item
I:\item
02/21/2013
02/21/2013
02/21/2013
02/21/2013
02/21/2013
02/21/2013
02/21/2013
02/21/2013
12:16
<DIR>
..
12:16 PM
PM
<DIR>
12:16
<DIR>
..
12:16 PM
PM
<DIR>
..
12:16
752
12:16 PM
PM
752 ItemUID.class
ItemUID.class
12:11
476
12:11 PM
PM
476 ItemUID.java
ItemUID.java
22 File(s)
1,228
File(s)
1,228 bytes
bytes
22 Dir(s)
48,619,646,976
bytes
Dir(s) 48,619,646,976 bytes free
free
I:\item>serialver
I:\item>serialver ItemUID
ItemUID
ItemUID:
static
ItemUID:
static final
final long
long serialVersionUID
serialVersionUID == -3358310746251373045L;
-3358310746251373045L;
I:\item>
I:\item>
26

27. serialVersionUID

Для того чтобы иметь возможность десериализовать сериализованный объект
класса в объект изменённого класса можно использовать специальное поле
serialVersionUID. Таким образом можно задать UID для класса и UID не будет
меняться при внесении изменений в класс.
Eclipse может выдавать предупреждение или не компилировать код если класс
реализует интерфейс Serializable, но не содержит поле serialVersionUID. Настроить
эту опцию в Eclipse можно в Window > Preferences > Java > Compiler > Errors /
Warnings > Potential Programming Problems. Если опция выдавать предупреждение
установлена можно использовать предупреждения для автоматического
добавления serialVersionUID.
27

28. Класс с serialVersionUID

public
public class
class ItemUID
ItemUID implements
implements Serializable{
Serializable{
private
private static
static final
final long
long serialVersionUID
serialVersionUID == 5210454654602398740L;
5210454654602398740L;
public
public ItemUID(String
ItemUID(String name,
name, int
int number)
number) {{
this.name
this.name == name;
name;
this.number
this.number == number;
number;
}}
public
public String
String getName()
getName() {{
return
return name;
name;
}}
public
public int
int getNumber()
getNumber() {{
return
return number;
number;
}}
public
public String
String toString()
toString() {{
return
return "[name="
"[name=" ++ name
name ++ ",
", number="
number=" ++ number
number ++ "]";
"]";
}}
}}
private
private String
String name;
name;
private
private int
int number;
number;
28

29. Сериализация

public
public class
class UIDObjectOutputDemo
UIDObjectOutputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
ItemUID
ItemUID coffemaker
coffemaker == new
new ItemUID("Coffemaker",
ItemUID("Coffemaker", 2912);
2912);
System.out.println(coffemaker);
System.out.println(coffemaker);
FileOutputStream
FileOutputStream fos
fos ==
ObjectOutputStream
ObjectOutputStream oos
oos
null;
null;
== null;
null;
try
try {{
fos
fos == new
new FileOutputStream("I:\\FileIO\\item.dat");
FileOutputStream("I:\\FileIO\\item.dat");
oos
oos == new
new ObjectOutputStream(fos);
ObjectOutputStream(fos);
oos.writeObject(coffemaker);
oos.writeObject(coffemaker);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
{
finally {
try
try {{
if
if (oos
(oos !=
!= null)
null)
oos.close();
oos.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
[name=Coffemaker,
[name=Coffemaker, number=2912]
number=2912]
29

30. Новый класс со старым serialVersionUID

public
public class
class ItemUID
ItemUID implements
implements Serializable{
Serializable{
private
private static
static final
final long
long serialVersionUID
serialVersionUID == 5210454654602398740L;
5210454654602398740L;
public
public ItemUID(String
ItemUID(String name,
name, int
int number,
number, String
String description)
description) {{
this.name
this.name == name;
name;
this.number
this.number == number;
number;
this.description
this.description == description;
description;
}}
public
public String
String getName()
getName() {{
return
return name;
name;
}}
public
public int
int getNumber()
getNumber() {{
return
return number;
number;
}}
public
public String
String toString()
toString() {{
return
return "[name="
"[name=" ++ name
name ++ ",
", number="
number=" ++ number
number ++ ",
", description="
description=" ++ description+"]";
description+"]";
}}
}}
private
private
private
private
private
private
String
String name;
name;
int
int number;
number;
String
String description;
description;
30

31. Десериализация

class
class UIDObjectInputDemo
UIDObjectInputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
FileInputStream
FileInputStream fis
fis == null;
null;
ObjectInputStream
ObjectInputStream ois
ois == null;
null;
try
try {{
fis
fis == new
new FileInputStream("I:\\FileIO\\item.dat");
FileInputStream("I:\\FileIO\\item.dat");
ois
ois == new
new ObjectInputStream(fis);
ObjectInputStream(fis);
ItemUID
ItemUID item
item == (ItemUID)
(ItemUID) ois.readObject();
ois.readObject();
System.out.println(item);
System.out.println(item);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} catch
catch (ClassNotFoundException
(ClassNotFoundException e)
e) {{
System.out.println("Class
System.out.println("Class was
was not
not found");
found");
}}
finally
finally {{
try
try {{
if
if (ois
(ois !=
!= null)
null)
ois.close();
ois.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
[name=Coffemaker,
[name=Coffemaker, number=2912,
number=2912, description=null]
description=null]
31

32.

readObject и writeObject
32

33. readObject и writeObject

Для некоторых классов можно существенно улучшить сериализацию по умолчанию.
Определив в классе методы readObject и writeObject можно изменить сериализацию
объекта класса. Состояние сохраняется посредством записи полей по отдельности с
помощью метода writeObject из класса ObjectOutputStream или методов для записи
примитивных типов данных из DataOutput.
33

34. Класс реализующий список с помощью массива

public
public class
class StringArrayList
StringArrayList implements
implements Serializable
Serializable {{
private
private
private
private
transient
transient
transient
transient
int
int size
size == 0;
0;
String
buf[]
String buf[] == new
new String[16];
String[16];
public
public void
void add(String
add(String s)
s) {{
buf[size]
buf[size] == s;
s;
size++;
size++;
}}
public
public String
String toString()
toString() {{
}}
StringBuffer
StringBuffer bb == new
new StringBuffer();
StringBuffer();
for
(int
i=0;
i<size;
for (int i=0; i<size; i++)
i++) {{
b.append(buf[i]);
b.append(buf[i]);
b.append("
b.append(" ");
");
}}
return
return b.toString();
b.toString();
private
private void
void writeObject(ObjectOutputStream
writeObject(ObjectOutputStream s)
s) throws
throws IOException
IOException {{
}}
s.defaultWriteObject();
s.defaultWriteObject();
s.writeInt(size);
s.writeInt(size);
for
for (int
(int i=0;
i=0; i<size;
i<size; i++)
i++)
s.writeObject(buf[i]);
s.writeObject(buf[i]);
private
private void
void readObject(ObjectInputStream
readObject(ObjectInputStream s)
s) throws
throws IOException,
IOException, ClassNotFoundException
ClassNotFoundException {{
}}
}}
s.defaultReadObject();
s.defaultReadObject();
int
int size
size == s.readInt();
s.readInt();
for
for (int
(int ii == 0;
0; ii << size;
size; i++)
i++)
add((String)s.readObject());
add((String)s.readObject());
34

35. Сериализация

public
public class
class CustomOutputDemo
CustomOutputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
StringLinkedList
StringLinkedList sList
sList == new
new StringLinkedList();
StringLinkedList();
sList.add("apple");
sList.add("apple");
sList.add("orange");
sList.add("orange");
sList.add("banana");
sList.add("banana");
System.out.println("List
System.out.println("List contents
contents are:
are: "" ++ sList);
sList);
FileOutputStream
FileOutputStream fos
fos == null;
null;
ObjectOutputStream
ObjectOutputStream oos
oos == null;
null;
try
try {{
fos
fos == new
new FileOutputStream("I:\\FileIO\\fruitlist.dat");
FileOutputStream("I:\\FileIO\\fruitlist.dat");
oos
oos == new
new ObjectOutputStream(fos);
ObjectOutputStream(fos);
System.out.println("Serializing
System.out.println("Serializing .....");
.....");
oos.writeObject(sList);
oos.writeObject(sList);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} finally
finally {{
try
try {{
if
if (oos
(oos !=
!= null)
null)
oos.close();
oos.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
List
List contents
contents are:
are: banana
banana orange
orange apple
apple
Serializing
.....
Serializing .....
35

36. Десериализация

class
class CustomInputDemo
CustomInputDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
FileInputStream
FileInputStream fis
fis == null;
null;
ObjectInputStream
ObjectInputStream ois
ois == null;
null;
try
try {{
fis
fis == new
new FileInputStream("I:\\FileIO\\fruitlist.dat");
FileInputStream("I:\\FileIO\\fruitlist.dat");
ois
ois == new
new ObjectInputStream(fis);
ObjectInputStream(fis);
System.out.println("Deserializing
System.out.println("Deserializing .....");
.....");
StringLinkedList
sList
=
(StringLinkedList)
StringLinkedList sList = (StringLinkedList) ois.readObject();
ois.readObject();
System.out.println("List
contents
are:
"
+
sList);
System.out.println("List contents are: " + sList);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("An
System.out.println("An I/O
I/O error
error occured");
occured");
}} catch
(ClassNotFoundException
e)
{
catch (ClassNotFoundException e) {
System.out.println("Class
System.out.println("Class was
was not
not found");
found");
}}
finally
finally {{
try
try {{
if
if (ois
(ois !=
!= null)
null)
ois.close();
ois.close();
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Error
System.out.println("Error closing
closing file");
file");
}}
}}
Deserializing
Deserializing .....
.....
List
List contents
contents are:
are: apple
apple orange
orange banana
banana
36
English     Русский Правила