Tải bản đầy đủ (.pdf) (37 trang)

nền tảng lập trình c bài 9 serialization

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (266.43 KB, 37 trang )

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

BinaryFormatter bf=new
BinaryFormatter();
bf Serialize(fs data);

Chuyển
đổi

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
]


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ử



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

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


t tườn
g
lửa tốt hơn Binar
y
FormatterCó khả năn
g


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

ngược
lại
.
định
dạng
XML

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ỉ




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

để
đáp
ứng
yêu
cầu
của
nhiều
người
dùng


để
đá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

×