1. Trang chủ
  2. » Công Nghệ Thông Tin

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

37 298 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nền Tảng Lập Trình C Bài 9 Serialization
Trường học Trường Đại Học Khoa Học Tự Nhiên Tp.HCM
Chuyên ngành Kỹ thuật phần mềm
Thể loại Bài giảng
Thành phố TP.HCM
Định dạng
Số trang 37
Dung lượng 266,43 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• Nhiều ứng dụng cần lưu trữ và trao đổi dữliệu được lưu trong các đối tượng với nhau • Serialization chuyển đổi : là tiến trình biến đổi và tái tạo các đối tượng để chúng có thể đ l t ữ

Trang 2

Kỹ thuật chuyển đổi với BinaryFormatter

lớp giao tiếp ISerializable

Trang 3

Nhiều ứng dụng cần lưu trữ và trao đổi dữ

liệu được lưu trong các đối tượng với nhau

Serialization (chuyển đổi) : là tiến trình biến

đổi và tái tạo các đối tượng để chúng có thể

đ l t ữ à t đổi iữ á ứ d

được lưu trữ và trao đổi giữa các ứng dụng.

.NET framework cung cấp nhiều kỹ thuật

chuyển đổi để đơn giản hóa tác vụ này

Trang 4

Serialize

Deserialize

Deserialize

Trang 5

Serialize

− Tiến trình chuyển một đối tượng thành chuỗi tuần tựcác byte để có thể lưu trữ hoặc trao đổi

− Các bước thực hiện

Tạo đối tượng Stream lưu kết quả chuyển đổi

Tạo đối tượng BinaryFormatter

Gọi phương thức BinaryFormatter.Serialize để chuyển đổi, lưu kết quả vào Stream

Trang 6

− Tạo đối tượng

BinaryFormatterChuyển đổi và

Trang 7

Deserialize

− Tiến trình chuyển chuỗi tuần tự các byte thu được từ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 phù hợp với kiểu của đối tượng ban đầu ạ p p ợp ợ g

Trang 8

− Chuyển đổi và lưu kết

quả

data=(string)bf.Deserialize(fs);

fs Close();

Trang 9

tăng hiệu quả / đáp ứng các yêu cầu của ứng dụng.public class ShoppingCartItem{

public int productId;

public decimal price;

public int quantity;

public decimal total;

Trang 10

Vô hiệu hóa chuyển Vô hiệu hóa chuyển [Serializable]

đổ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ánThêm th ộc tính

public decimal price;

public int quantity;

public decimal total;

NonSer[ialized]

− Thêm thuộ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 được khởi tạo khi

Trang 11

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

Trang 12

Tự động khởi tạ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=price*quantity; p q y }

Trang 13

− Phát sinh ngoại lệ khi deserialize đối tượng được

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

Trang 14

Tương thích phiên bản

[Seriali able]

public class ShoppingCartItem : IDeserializationCallback {

public int productId;

public decimal price;

public int quantity;

[NonSerialized] public decimal total;

Trang 15

− 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 thuộc tính NonSerialized cho thành

phần không áp dụng thuộc tính này ở phiên bản trước

− Không đổi tên/ kiểu của thành phần serializeg p

− Áp dụng OptionalField khi khi thêm mới thành phần

serializeKhi bỏ h ộ í h N S i li d h hà h hầ khô

− Khi bỏ thuộc tính NonSerialized cho thành phần không

áp dụng thuộc tính này ở phiên bản trước, dùng OptionalField

Trang 16

Chọn định dạng chuyển đổi

− NET Framework cung cấp 2 phươ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

đối tượng sẽ chỉ được hiểu bởi các ứng dụng NET

Trang 17

Serialize

Deserialize

Deserialize

Trang 18

XML : định dạng tài liệu văn bản chuẩn cho việc

lưu trữ và trao đổi thông tin.

đọc, ghi file XML, chuyển đổi các đối tượng sang định dạng XML và ngược lại.

− Khả năng giao tiếp rộng

− Thân thiện với người dùng, dễ dàng đọc và hiệu chỉnh

− Khả năng tương thích phiên bản cao Khả năng tương thích phiên bản cao

Trang 19

Hạn chế của XML Serialization

− Chỉ có thể chuyển đổi các dữ liệu public

− Không thể chuyển đổi đối tượng đồ thị, biểu đồ

Trang 21

Demo Serialize

− Tạo đối tượng lưuTạo đối tượng lưu FileStream fs=new FileStream(“SerializedDate xml” FileMode

kết quả chuyển đổi

− Tạo đối tượng

FileStream( SerializedDate.xml ,FileMode Create);

XmlSerializer xs=new

gXmlSerializer

− Thực thi chuyển đổi

XmlSerializer(typeof(Date));

xs.Serialize(fs,System.DateTime.Now);

fs.Close();

Trang 23

Demo Deserialize

− Tạo đối tượng đọcTạ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

XmlSerializerThực thi tái tạ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());

Time: “ +time.TimeOfday.ToString());

Trang 24

Tạo lớp có thể serialize

− Khi chuyển đổi các lớp đáp ứng yêu cầu Xmlserialization nhưng không có bất kỳ thuộc tính XmlSerialization 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ộc vào tên lớp và tên thành phần

Mỗi thành phần được chuyển đổi thành một Xml element riêng biệt.

Trang 25

Tạo lớp có thể chuyển đổi

public class ShoppingCartItem{

public int productId;

public decimal price;

public int quantity;

public decimal total;

Trang 26

Tạo lớp có thể chuyển đổi

− Nếu chỉ tạo tài liệu XML mô tả lớp kết quả quá trìnhNếu chỉ tạo tài liệu XML mô tả lớp, kết quả quá trình

chuyển đổi được coi là đủ

− Nếu muốn tạo tài liệu XML đáp ứng những yêu cầu cụ

thể : cần can thiệp vào quá trình chuyển đổi để tài liệu XML có định dạng theo yêu cầu

Trang 27

[XmlRoot (“CartItem”)] <?xml version=“1.0” ?>

public class ShoppingCartItem{

[XmlAttribute] public int productId;

public decimal price;

<CartItem productId=“100”>

<price>12.0</price>

<quantity>5</quantity>

public decimal price;

public int quantity;

public decimal total;

Trang 28

Chuyển đổi 1 đối tượng DataSet y ợ g

private void SerializeDataSet(string filename){

XmlSerializer ser=new XmlSerializer(typeof(DataSet));

DataSet ds=new DataSet(“myDataSet”);

DataTable dt=new DataTable(“table1”);

Trang 29

Kỹ thuật chuyển đổi lớp đối tượng thông qua

lớp giao tiếp ISerializable p g p

Tiến trình điều khiển việc chuyển đổi và tái

tạo đối tượng, đảm bảo tương thích phiên ạ ợ g g p

bản

Trang 30

Thực thi custom serialization

− Serialize trong NET rất uyển chuyển và có thể tùybiến để đáp ứng yêu cầu phát triển ứng dụng

− Có thể override quá trình serialize xây dựng sẵn trong

.NET bằng cách thực thi interface Iserializable và khaibáo thuộc tính Serializable cho lớp

Thực thi interface Iserializable sẽ gọi

− Thực thi interface Iserializable sẽ gọi

Phương thức GetObjectData trong quá trình serialize

Phương thức khởi tạo đặc biệt trong quá trình deserialize Phương thức khởi tạo đặc biệt trong quá trình deserialize

Trang 31

public class ShoppingCartItem : ISerializable { StreamingContext context){

productId = info.GetInt32("Product ID");

price = info GetDecimal("Price");

public Int32 productId;

public decimal price;

public Int32 quantity;

[NonSerialized] public decimal total;

price info.GetDecimal( Price );

quantity = info.GetInt32("Quantity");

total = price * quantity;

} [NonSerialized] public decimal total;

public ShoppingCartItem(Int32 _productId,

decimal _price, int _quantity){

[SecurityPermissionAttribute(SecurityAction.D emand,SerializationFormat=true)]

public virtual void productId = _productId;

price = _price;

quantity = _quantity;

total = price * quantity;

GetObjectData(SerializationInfo info,StreamingContext context){

info.AddValue("Product ID", productId);

info.AddValue("Price", price);

total = price * quantity;

Trang 32

Các sự kiện trong Serialization

− Serializing: phát sinh trước khi serialize bắt đầu

Thêm thuộc tính OnSerializing trước phương thức

− Serialized: phát sinh sau khi serialize hoàn tất

Thêm thuộc tính OnSerialized trước phương thức

− Deserializing: phát sinh trước khi deserialize bắt đầu

Thêm thuộc tính OnDeserializing trước phương thức

− Deserialized: phát sinh sau khi serialize kết thúc

Thêm thuộc tính OnDeserialized trước phương thức

Trang 33

Serialization begins Deserialization begins

[OnSerialized]

Deserialization occurs

IDeserializationCallback, OnDeserialization Serialization completed

[OnSerialized]

Trang 34

Các sự kiện trong Serialization

− Các sự kiện này là cách tốt nhất và dễ dàng nhất đểđiều khiển tiến trình chuyển đổi

[Serializable]

public class ShoppingCartItem : ISerializable { public Int32 productId;

điều khiển tiến trình chuyển đổi

Không can thiệp vào serialization stream

Cho phép hiệu chỉnh đối tượng trước và sau serialize

public decimal price;

public Int32 quantity;

public decimal total;

Cho phép hiệu chỉnh đối tượng trước và sau serialize (deserialize)

− Yêu cầu cho các phương thức xử lý các sự kiện

[OnSerializing] void CalculateTotal(StreamingContext sc){

total=price*quantity;

} [OnDeserialization] void CheckTotal(StreamingContext sc){

Có tham số là đối tượng StreamingContext

Không trả về kết quả

[OnDeserialization] void CheckTotal(StreamingContext sc){

Trang 35

− Khi serialize 1 đối tượng: không cần quan tâm đích đến

− Trong vài trường hợp: serialize và deserialize sẽ khác

− Trong vài trường hợp: serialize và deserialize sẽ khácnhau phụ thuộc vào đích đến

− Cấu trúc StreamingContext cung cấp thông tin đíchg g p gđến của đối tượng được serialize cho lớp xử lý thực thiinterface Iserializable

Trang 36

Các cờ hiệu của thuộc tính State

Trang 37

Thanks

Ngày đăng: 23/05/2014, 15:59

TỪ KHÓA LIÊN QUAN