TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
1
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Bài 9: Serialization
• Kỹ thuật chuyển đổi với BinaryFormatter
•
Kỹ th ậth ể đổi ớiX lS i li
•
Kỹ
th
u
ật
c
h
uy
ể
n
đổi
v
ới
X
m
lS
er
i
a
li
zer
• Kỹ thuật chuyển đổi lớp đối tượng thông qua
lớpgiaotiếp ISerializable
lớp
giao
tiếp
ISerializable
2
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Serialization
• Nhiều ứng dụng cầnlưutrữ và trao đổidữ
liệu đượclưu trong các đốitượng với nhau
• Serialization (chuyển đổi) : là tiến trình biến
đổivàtáitạo các đốitượng để chúng có thể
đ
l
t ữ
à
t
đổi
iữ
á
ứ
d
đ
ược
l
ưu
t
r
ữ
v
à
t
rao
đổi
g
iữ
ac
á
c
ứ
ng
d
ụng.
• .NET framework cung cấpnhiềukỹ thuật
chuyển
đổi
để
đơn
giản
hóa
tác
vụ
này
chuyển
đổi
để
đơn
giản
hóa
tác
vụ
này
3
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Serialize
•
Deserialize
•
Deserialize
4
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Serialize
−
Tiến
trình
chuyển
một
đối
tượng
thành
chuỗi
tuần
tự
Tiến
trình
chuyển
một
đối
tượng
thành
chuỗi
tuần
tự
các byte để có thể lưutrữ hoặctraođổi.
− Các bướcthựchiện
• Tạo đốitượng Stream lưukếtquả chuyển đổi
• Tạo đốitượng BinaryFormatter
• Gọiphương thức BinaryFormatter.Serialize để chuyển
đổi, lưukếtquả vào Stream
5
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Demo serialize
−
Tạo
đối
tượng
string data=“This must be store in a file”;
Tạo
đối
tượng
lưukếtquả
chuyển đổi
ố
FileStream fs=new
FileStream(“SerializedString.Data”,F
ileMode.Create);
− Tạo đ
ố
itượng
BinaryFormatter
Chuyển
đổi
và
BinaryFormatter bf=new
BinaryFormatter();
bf Serialize(fs data);
−
Chuyển
đổi
và
lưukếtquả
bf
.
Serialize(fs
,
data);
fs.Close();
6
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Deserialize
−
Tiến trình chuyểnchuỗituầntự các byte thu đượctừ
Tiến
trình
chuyển
chuỗi
tuần
tự
các
byte
thu
được
từ
quá trình serialize thành đối tượng ban đầu
− Các bước thực hiện
• Tạo Stream đọc kết quả của quá trình serialize
• Tạo đối tượng BinaryFormatter
• Tạo đối tượng lưu dữ liệu sau khi chuyển đổi
• Gọi phương thức BinaryFormatter.Deserialize để chuyển
đ
ổ
i l
ạ
i và é
p
ki
ể
u
p
hù h
ợp
với ki
ể
u của đối tư
ợ
n
g
ban đầu
7
ạ p p ợp ợ g
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Demo deserialize
− Tạo stream đọckết
ả
h
đ
ừ
á
FileStream fs=new
qu
ả
t
h
u
đ
ượct
ừ
qu
á
trình serialize
−
Tạo
đối
tượng
FileStream(“SerializedString.
Data”,FileMode.Create);
BinaryFormatter bf=new
Tạo
đối
tượng
BinaryFormatter
− Tạo đốitượn
g
lưukết
ể
ổ
BinaryFormatter
bf=new
BinaryFormatter();
string data=“”;
g
quả chuy
ể
n đ
ổ
i
− Chuyển đổivàlưukết
quả
data=(string)bf.Deserialize(fs);
fs Close();
8
quả
fs
.
Close();
Console.WriteLine(data);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Tạolớpcóthể serialize
−
Thêm
thuộc
tính
Serializable
vào
lớp
cần
chuyển
đổi
Thêm
thuộc
tính
Serializable
vào
lớp
cần
chuyển
đổi
,
.NET framework sẽ tựđộng serialize.
− Có thể kiểmsoát
q
uá trình serialize củacáclớ
p
để
ầ
[Serializable]
q
p
tăng hiệuquả
/
đáp ứng các yêu c
ầ
ucủa ứng dụng.
public class ShoppingCartItem{
public int productId;
public decimal price;
public int quantity;
public decimal total;
9
…
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
•
Vô hiệu hóa chuyển
[
Serializable
]
Vô
hiệu
hóa
chuyển
đổi các thành phần
của lớp
[]
public class ShoppingCartItem{
public int productId;
public decimal price;
− Những giá trị tạm,
thuộc tính tính toán
Thêm th ộc tính
public
decimal
price;
public int quantity;
public decimal total;
NonSer[ialized]
−
Thêm
th
u
ộc
tính
NonSerialized trước
khai báo
public ShoppingCartItem(int
_procId,decimal _price,int _quan){
productId=_procId;
− Thành phần
NonSerialized không
đượckhởitạokhi
price=_price;
quantity=_quan;
total=price+quantity;
10
được
khởi
tạo
khi
deserialize.
}
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Tự động khởi tạo các thành phần NonSerialized
khi deserialize:
− Thực thi interface IDeserializationCallback
− Thực thi phương thức
IDeserializationCallback OnDeSerialization
IDeserializationCallback
.
OnDeSerialization
11
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
•
Tự động khởitạo các thành phần NonSerialized
Tự
động
khởi
tạo
các
thành
phần
NonSerialized
khi deserialize:
[Serializable]
public class ShoppingCartItem : IDeserializationCallback{
….
[NonSerialized] public decimal total;
public ShoppingCartItem(int _procId,decimal _price,int _quan){
…
total=price+quantity;
}
void IDeserializationCallback.OnDeserialization(object sender){
total=
p
rice*
q
uantit
y
;
12
pq y
}
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
•
T thí h hiê bả
•
T
ương
thí
c
h
p
hiê
n
bả
n
− Phát sinh ngoại lệ khi deserialize đối tượng được
serialize ở phiên bảntrướccủa ứng dụng
serialize
ở
phiên
bản
trước
của
ứng
dụng
• Thêm thành phần mới vào lớp, deserialize đối tượng được
serialize trước đó mà không có thành phần mới
− Giải pháp:
• Thực thi custom serialization
ầ
• Thêm thuộc tính OptionalField trước thành ph
ầ
n mới có
thể gây không tương thích phiên bản
−
Thành phần OptionalField không đượckhởitạokhi
13
Thành
phần
OptionalField
không
được
khởi
tạo
khi
deserialize
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Tương thích phiên bản
[Seriali able]
[Seriali
z
able]
public class ShoppingCartItem : IDeserializationCallback{
public int productId;
public decimal price;
public int quantity;
[
NonSerialized
]
p
ublic decimal total
;
[]
p;
[OptionalField] public bool taxable;
…
}
14
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
•
Lưuýkhixử lý tương thích phiên bản
•
Lưu
ý
khi
xử
lý
tương
thích
phiên
bản
− Không bỏ thành phần serialize
Không áp d ng th ộc tính NonSeriali ed cho thành
−
Không
áp
d
ụ
ng
th
u
ộc
tính
NonSeriali
z
ed
cho
thành
phần không áp dụng thuộc tính này ở phiên bản trước.
− Khôn
g
đổi tên/ kiểu của thành
p
hần serialize
g p
− Áp dụng OptionalField khi khi thêm mới thành phần
serialize
Khi bỏ h ộ íhN S ili d h hàh hầ khô
−
Khi
bỏ
t
h
u
ộ
c t
í
n
h
N
on
S
er
i
a
li
ze
d
c
h
o t
hà
n
h
p
hầ
n
khô
ng
áp dụng thuộc tính này ở phiên bản trước, dùng
OptionalField
15
− Với các thành phần OptionalField, thực thi
IDeserializationCallback để khởi tạo giá trị ban đầu
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với BinaryFormatter
• Chọn định dạng chuyển đổi
−
NET Framework cung cấp2phương thức định dạng
.
NET
Framework
cung
cấp
2
phương
thức
định
dạng
dữ liệu chuyển đổi:
• BinaryFormatter: định dạng hiệu quả nhất để serialize các
đốit ẽ hỉ đ hiể bởiáứ d NET
đối
t
ượng s
ẽ
c
hỉ
đ
ược
hiể
u
bởi
c
á
c
ứ
ng
d
ụng .
NET
• SoapFormatter:
–– đ
ị
nh d
ạ
n
g
XML
,
là cách thức đán
g
tin c
ậy
để serialize đ
ị
nh d
ạ
n
g
XML
,
là cách thức đán
g
tin c
ậy
để serialize
ị ạ g, g ậyị ạ g, g ậy
các đối tượng được trao đổi trên môi trường mạng/ các đối tượng được trao đổi trên môi trường mạng/
được hiểu bởi các ứng dụng ngoài .NETđược hiểu bởi các ứng dụng ngoài .NET
––Có khả năn
g
vư
ợ
t tườn
g
lửa tốt hơn Binar
y
FormatterCó khả năn
g
vư
ợ
t tườn
g
lửa tốt hơn Binar
y
Formatter
16
g ợ g yg ợ g y
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Serialize
•
Deserialize
•
Deserialize
17
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• XML : định dạng tài liệuvănbảnchuẩnchoviệc
lưutrữ và trao đổi thông tin.
• .NET Framework cung cấp nhiềuthư việnhỗ trợ
đọc, ghi file XML, chuyển đổicácđốitượng sang
định
dạng
XML
và
ngược
lại
.
định
dạng
XML
và
ngược
lại
.
• Tại sao sử dụng XML Serialization
−
Khả
năng
giao
tiếp
rộng
Khả
năng
giao
tiếp
rộng
− Thân thiệnvớingười dùng, dễ dàng đọcvàhiệuchỉnh
−
Khả
năng
tương
thích
phiên
bản
cao
18
Khả
năng
tương
thích
phiên
bản
cao
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Hạn chế của XML Serialization
−
Chỉ có thể chuyển đổicácdữ liệu public
Chỉ
có
thể
chuyển
đổi
các
dữ
liệu
public
− Không thể chuyển đổi đối tượng đồ thị, biểu đồ
19
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Serialize
−
Các bướcthựchiện
Các
bước
thực
hiện
• Tạo đối tượng Stream/ TextWriter/ XmlWriter để lưu kết
quả chuyển đổi
• Tạo đối tượng XmlSerializer với kiểu của đối tượng cần
chuyển đổi
• G
ọ
i
p
hươn
g
thức XmlSerializer.Serialize đ
ể
chu
yể
n đ
ổ
i và
ọ p g y
lưu kết quả.
20
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Demo Serialize
−
Tạo đốitượng lưu
FileStream fs=new
FileStream(
“
SerializedDate xml
”
FileMode
Tạo
đối
tượng
lưu
kết quả chuyển đổi
− Tạo đối tượn
g
FileStream( SerializedDate
.
xml
,
FileMode
.
Create);
XmlSerializer xs=new
g
XmlSerialize
r
− Thực thi chuyển đổi
X
mlSerializer(typeof(Date));
xs.Serialize(fs,System.DateTime.Now);
fs.Close();
21
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Deserialize
−
Các bướcthựchiện
Các
bước
thực
hiện
• Tạo đối tượng Stream/ TextWriter/ XmlWriter để đọc kết
quả chuyển đổi của quá trình serialize
• Tạo đối tượng XmlSerializer với kiểu của đối tượng cần
chuyển đổi
• G
ọ
i
p
hươn
g
thức XmlSerializer.Deserialize đ
ể
tái t
ạ
o đối
ọ p g ạ
tượng ban đầu, ép kiểu dữ liệu cho phù hợp
22
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Demo Deserialize
−
Tạo đốitượng đọc
Tạo
đối
tượng
đọc
kết quả quá trình
serialize
ố
FileStream fs=new
FileStream(“SerializedDate.xml”,FileMode.
Open);
− Tạo đ
ố
i tượng
XmlSerializer
Thựcthitáitạo đối
XmlSerializer xs=new
XmlSerializer(typeof(Date));
−
Thực
thi
tái
tạo
đối
tượng
Datetime time=(DateTime)xs.Deserialize(fs);
fs.Close();
Console.WriteLine(“Day: “+time.DayOfWeek +”,
Time: “ +time TimeOfday ToString());
23
Time:
“
+time
.
TimeOfday
.
ToString());
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Tạolớpcóthể serialize
−
Khi
chuyển
đổi
các
lớp
đáp
ứng
yêu
cầu
Xml
Khi
chuyển
đổi
các
lớp
đáp
ứng
yêu
cầu
Xml
serialization nhưng không có bấtkỳ thuộc tính Xml
Serialization nào, .NET sẽ dùng định dạng mặc định
có
để
đáp
ứng
yêu
cầu
của
nhiều
người
dùng
có
để
đáp
ứng
yêu
cầu
của
nhiều
người
dùng
.
• Tên của Xml element : phụ thuộcvàotênlớpvàtênthành
phần
• Mỗi thành phần được chuyển đổi thành một Xml element
riêng biệt.
24
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Kỹ thuật chuyển đổi với XmlSerializer
• Tạo lớp có thể chuyển đổi
public class ShoppingCartItem{
public int productId;
p
ublic decimal
p
rice;
<?xml version=“1.0” ?>
<ShoppingCartItem>
<
p
roductId>100</
p
roductId>
Serialize
pp
public int quantity;
public decimal total;
public ShoppingCartItem(){
pp
<price>12.0</price>
<quantity>5</quantity>
</ShoppingCartItem>
Serialize
public
ShoppingCartItem(){
}
}
</ShoppingCartItem>
25