Microsoft ได้ตระหนักถึงความสำคัญของข้อมูลซีเรียลไลซ์ ดังนั้นจึงได้รวมเนมสเปซ System.Runtime.Serialization และ System.Xml.Serialization ไว้ในเฟรมเวิร์ก .NET เพื่อให้ฟังก์ชันซีเรียลไลซ์ไลซ์ และให้ผู้ใช้สามารถเขียนวิธีการซีเรียลไลซ์ไลซ์ของตนเองได้ . เนมสเปซ System.Xml.Serialization มีวิธีการพื้นฐานสำหรับการทำให้ออบเจ็กต์เป็นอนุกรมในรูปแบบ XML เรามาดูวิธีการใช้วิธีนี้กัน
เสน่ห์ของ XML
Serialized XML หมายถึงกระบวนการบันทึกฟิลด์สาธารณะและคุณลักษณะของออบเจ็กต์เป็นรูปแบบอนุกรม (ในที่นี้คือรูปแบบ XML) เพื่อความสะดวกในการจัดเก็บหรือส่งข้อมูล การดีซีเรียลไลซ์เป็นกระบวนการของการใช้ข้อมูลสถานะอนุกรมเพื่อกู้คืนอ็อบเจ็กต์จากสถานะ XML อนุกรมไปเป็นสถานะดั้งเดิม ดังนั้น คุณสามารถนึกถึงการทำให้เป็นอนุกรมเป็นวิธีการบันทึกสถานะของอ็อบเจ็กต์ลงในสตรีมหรือบัฟเฟอร์ได้
วัตถุประสงค์ของการทำให้เป็นอนุกรมคือการจัดเก็บข้อมูลและการแปลงข้อมูล การจัดเก็บข้อมูลหมายถึงการบันทึกข้อมูลระหว่างเซสชันของผู้ใช้ เมื่อปิดแอปพลิเคชัน ข้อมูลจะถูกบันทึก (เป็นอนุกรม) และเมื่อผู้ใช้กลับมา ข้อมูลจะถูกโหลดซ้ำ (ดีซีเรียลไลซ์) การแปลงข้อมูลหมายถึงการแปลงข้อมูลเป็นรูปแบบที่ระบบอื่นสามารถเข้าใจได้ การใช้การทำให้เป็นอนุกรมและ XML ทำให้การแปลงข้อมูลทำได้อย่างง่ายดาย
ข้อมูลในออบเจ็กต์อาจเป็นคลาส วิธีการ คุณสมบัติ ประเภทส่วนตัว อาร์เรย์ หรือแม้แต่ XML ที่ฝังอยู่ในออบเจ็กต์ System.Xml.XmlElement หรือ System.Xml.XmlAttribute
คลาสคีย์ในเนมสเปซ System.Xml.Serialization คือ XmlSerializer แน่นอนว่า เนมสเปซนี้ยังรวมถึงคลาสอื่นๆ ที่เกี่ยวข้องกับแง่มุมอื่นๆ ของ XML และ SOAP ด้วย แต่เรามุ่งเน้นที่คลาส XmlSerializer
XmlSerializer
คลาส XmlSerializer จัดเตรียมวิธีการสำหรับซีเรียลไลซ์อ็อบเจ็กต์ลงในไฟล์ XML และดีซีเรียลไลซ์เอกสาร XML ลงในอ็อบเจ็กต์ นอกจากนี้ยังอนุญาตให้ผู้ใช้ระบุวิธีการแปลงวัตถุเป็น XML คุณสามารถส่งประเภทของอ็อบเจ็กต์ที่จะซีเรียลไลซ์เป็นพารามิเตอร์ไปยังตัวสร้างคลาสได้ รหัส C# ต่อไปนี้แสดงให้เห็นถึงการใช้ตัวสร้าง
XmlSerializer ser = new XmlSerializer(typeof(objectToSerialize));
ต่อไปนี้คือโค้ด VB.NET ที่เทียบเท่ากัน:
Dim ser As New XmlSerializer(GetType(objectToSerialize))
กระบวนการทำให้เป็นอนุกรมจริงถูกนำมาใช้ในวิธีการทำให้เป็นอนุกรมของคลาส XmlSerializer วิธีการนี้อนุญาตให้เรียกออบเจ็กต์ TextWriter, Stream และ XmlWriter ระหว่างการทำให้เป็นอนุกรม รหัสตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการเรียกวิธีนี้ ในตัวอย่างนี้ ออบเจ็กต์จะถูกทำให้เป็นอนุกรมและบันทึกลงในไฟล์บนโลคัลดิสก์ ตัวอย่างเริ่มต้นด้วยการประกาศคลาส ตามด้วยซอร์สโค้ดที่ต่อเนื่องกัน
ใช้ระบบ;
การสร้างซีเรียลไลเซชันเนมสเปซ {
ที่อยู่ชั้นเรียนสาธารณะ {
ที่อยู่สาธารณะ() {}
สตริงสาธารณะ Address1;
สตริงสาธารณะ Address2;
เมืองสตริงสาธารณะ;
สถานะสตริงสาธารณะ
สตริงสาธารณะ Zip;
ประเทศสตริงสาธารณะ;
-
ใช้ระบบ;
การสร้างซีเรียลไลเซชันเนมสเปซ {
ผู้แต่งในชั้นเรียนสาธารณะ {
ผู้แต่งสาธารณะ () { }
ชื่อสตริงสาธารณะ;
MiddleName สตริงสาธารณะ;
นามสกุลสตริงสาธารณะ;
ชื่อสตริงสาธารณะ;
เพศสตริงสาธารณะ;
ที่อยู่สาธารณะ AddressObject;
-
การสร้างซีเรียลไลเซชันเนมสเปซ {
หนังสือเรียนสาธารณะ {
หนังสือสาธารณะ () { }
ชื่อสตริงสาธารณะ;
AuthorObject ผู้เขียนสาธารณะ;
ISBN สตริงสาธารณะ
ราคาขายปลีกสาธารณะสองเท่า;
ผู้เผยแพร่สตริงสาธารณะ;
-
ใช้ระบบ;
ใช้ System.Xml.Serialization;
ใช้ System.IO;
การสร้างซีเรียลไลเซชันเนมสเปซ {
คลาสทดสอบคลาส {
โมฆะคงที่หลัก (สตริง [] args) {
หนังสือ BookObject = หนังสือเล่มใหม่ ();
XmlSerializer ser = XmlSerializer ใหม่ (ประเภทของ (หนังสือ));
ผู้เขียน TextWriter = StreamWriter ใหม่ ("booktest.xml");
BookObject.Title = "LotusScript เชิงปฏิบัติ";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "แมนนิ่งสิ่งพิมพ์";
BookObject ราคาขายปลีก = 43.95;
BookObject.AuthorObject = ผู้เขียนใหม่();
BookObject.AuthorObject.FirstName = "โทนี่";
BookObject.AuthorObject.LastName = "แพตตัน";
BookObject.AuthorObject.Gender = "ชาย";
BookObject.AuthorObject.AddressObject = ที่อยู่ใหม่ ();
BookObject.AuthorObject.AddressObject.Address1 = "1 ถนนสายหลัก";
BookObject.AuthorObject.AddressObject.City = "ทุกที่";
BookObject.AuthorObject.AddressObject.State = "KY";
BookObject.AuthorObject.AddressObject.Zip = "40000";
BookObject.AuthorObject.AddressObject.Country = "สหรัฐอเมริกา";
ser.Serialize (ผู้เขียน BookObject);
นักเขียน.ปิด();
} } }
โค้ดด้านบนจะเปลี่ยนวัตถุสามชิ้นให้เป็นวัตถุเดียว ดังนั้น จึงสร้างไฟล์ XML ในระหว่างกระบวนการซีเรียลไลซ์ ต่อไปนี้เป็นเอกสาร XML ที่สร้างโดยโปรแกรมตัวอย่าง:
<?xml version="1.0" encoding="utf-8"?>
<หนังสือ xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<Title>LotusScript ที่ใช้งานได้จริง</Title>
<วัตถุผู้เขียน>
<FirstName>โทนี่</FirstName>
<นามสกุล>แพตตัน</นามสกุล>
<เพศ>ชาย</เพศ>
<วัตถุที่อยู่>
<ที่อยู่1>1 ถนนสายหลัก</ที่อยู่1>
<เมือง>ทุกที่</เมือง>
<รัฐ>KY</รัฐ>
<ซิป>40000</ซิป>
<ประเทศ>สหรัฐอเมริกา</ประเทศ>
</ที่อยู่วัตถุ>
</ผู้เขียนวัตถุ>
<ISBN>1884777767 </ISBN>
<ราคาขายปลีก>43.95</ราคาขายปลีก>
<Publisher>แมนนิ่งสิ่งพิมพ์</Publisher>
</Book>
โปรดทราบว่ากระบวนการซีเรียลไลเซชันยังสามารถจัดการการซ้อนข้อมูลอ็อบเจ็กต์ได้ ข้อมูลจะถูกแปลงเป็นรูปแบบที่จดจำได้ ซึ่งอำนวยความสะดวกในการรีโหลดข้อมูล (ดีซีเรียลไลซ์) และถ่ายโอนข้อมูลไปยังระบบอื่น ในระหว่างขั้นตอนการถ่ายโอนข้อมูล ระบบรับข้อมูลจำเป็นต้องทราบรูปแบบของไฟล์ XML (หากไม่ทราบล่วงหน้า) ดังนั้นจึงจำเป็นต้องจัดเตรียมไฟล์สคีมา XML เครื่องมือ XSD.exe ใน .NET Framework สามารถสร้างไฟล์ schema สำหรับ XML ที่ทำให้ซีเรียลไลซ์ได้
ต่อไปนี้เป็นตัวอย่างโค้ดที่เขียนใน VB.NET:
Public Class Address
ที่อยู่สาธารณะ 1 เป็นสตริง
ที่อยู่สาธารณะ 2 เป็นสตริง
เมืองสาธารณะเป็นสตริง
รัฐสาธารณะเป็นสตริง
Zip สาธารณะเป็นสตริง
ประเทศสาธารณะเป็นสตริง
จบคลาส
ผู้เขียนชั้นเรียนสาธารณะ
ชื่อสาธารณะเป็นสตริง
ชื่อกลางสาธารณะเป็นสตริง
นามสกุลสาธารณะเป็นสตริง
ชื่อสาธารณะเป็นสตริง
เพศสาธารณะเป็นสตริง
ที่อยู่สาธารณะวัตถุเป็นที่อยู่
จบคลาส
หนังสือเรียนสาธารณะ
AuthorObject สาธารณะในฐานะผู้เขียน
ชื่อสาธารณะเป็นสตริง
ISBN สาธารณะเป็นสตริง
ราคาขายปลีกสาธารณะเป็นสองเท่า
ผู้เผยแพร่สาธารณะเป็นสตริง
จบคลาส
นำเข้า System.Xml.Serialization
ImportsSystem.IO
โมดูล โมดูล1
หลักย่อย()
Dim BookObject เหมือนหนังสือเล่มใหม่
Dim ser As ใหม่ XmlSerializer (GetType (หนังสือ))
นักเขียน Dim ในฐานะ StreamWriter ใหม่ ("booktest.xml")
ด้วย BookObject
.Title = "LotusScript เชิงปฏิบัติ"
.ISBN = "1884777767 "
.Publisher = "แมนนิ่งสิ่งพิมพ์"
.ราคาขายปลีก = 43.95
.AuthorObject = ผู้เขียนใหม่
.AuthorObject.FirstName = "โทนี่"
.AuthorObject.LastName = "แพตตัน"
.AuthorObject.Gender = "ชาย"
.AuthorObject.AddressObject = ที่อยู่ใหม่
.AuthorObject.AddressObject.Address1 = "1 ถนนสายหลัก"
.AuthorObject.AddressObject.City = "ทุกที่"
.AuthorObject.AddressObject.State = "KY"
.AuthorObject.AddressObject.Zip = "40000"
.AuthorObject.AddressObject.Country = "สหรัฐอเมริกา"
จบด้วย
ser.Serialize (ผู้เขียน BookObject)
นักเขียน.ปิด()
จบหมวดย่อย
เอาต์พุตควบคุม
โมดูลสิ้นสุด
กระบวนการซีเรียลไลเซชันจะสร้างไฟล์ XML มาตรฐานและสมาชิกข้อมูลจะถูกแปลงเป็นองค์ประกอบ XML อย่างไรก็ตาม ไม่ใช่ว่าสมาชิกข้อมูลทุกคนจะกลายเป็นองค์ประกอบ คุณสามารถควบคุมไฟล์ XML เอาต์พุตได้โดยเพิ่มแท็กบางส่วนในโค้ดของชั้นเรียน ด้วยวิธีนี้ สมาชิกข้อมูลสามารถแปลงเป็นแอตทริบิวต์ XML แทนที่จะเป็นองค์ประกอบ หรือเพิกเฉยได้ ตัวอย่างต่อไปนี้คือรหัส VB.NET คลาสหนังสือที่ถูกแก้ไข
หนังสือเรียนสาธารณะ
AuthorObject สาธารณะในฐานะผู้เขียน
ชื่อสาธารณะเป็นสตริง
<System.Xml.Serialization.XmlAttribute()> _
ISBN สาธารณะเป็นสตริง
<System.Xml.Serialization.XmlIgnoreAttribute()> _
ราคาขายปลีกสาธารณะเป็นสองเท่า
ผู้เผยแพร่สาธารณะเป็นสตริง
คลาสสิ้นสุด
รหัสนี้บอกให้ระบบใช้สมาชิกคลาส ISBN เป็นแอตทริบิวต์ XML เมื่อสร้างไฟล์ XML และละเว้นสมาชิกราคาขายปลีก การเปลี่ยนแปลงนี้สามารถเห็นได้ในไฟล์ XML ที่สร้างขึ้น:
<?xml version="1.0" encoding="utf-8"?>
<หนังสือ xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance " ISBN="1884777767 ">
<วัตถุผู้เขียน>
<FirstName>โทนี่</FirstName>
<นามสกุล>แพตตัน</นามสกุล>
<เพศ>ชาย</เพศ>
<วัตถุที่อยู่>
<ที่อยู่1>1 ถนนสายหลัก</ที่อยู่1>
<เมือง>ทุกที่</เมือง>
<รัฐ>KY</รัฐ>
<ซิป>40000</ซิป>
<ประเทศ>สหรัฐอเมริกา</ประเทศ>
</ที่อยู่วัตถุ>
</ผู้เขียนวัตถุ>
<Title>LotusScript ที่ใช้งานได้จริง</Title>
<Publisher>แมนนิ่งสิ่งพิมพ์</Publisher>
</Book>
ต่อไปนี้เป็นรหัส C# ที่สอดคล้องกัน:
หนังสือคลาสสาธารณะ {
หนังสือสาธารณะ () { }
ชื่อสตริงสาธารณะ;
AuthorObject ผู้เขียนสาธารณะ;
[System.Xml.Serialization.XmlAttribute()]
ISBN สตริงสาธารณะ
[System.Xml.Serialization.XmlIgnoreAttribute()]
ราคาขายปลีกสาธารณะสองเท่า;
ผู้เผยแพร่สตริงสาธารณะ;
}
ข้อความข้างต้นกล่าวถึงสัญลักษณ์การทำเครื่องหมายสองรายการเพียงสั้นๆ เท่านั้น โปรดศึกษาเอกสารประกอบ .NET เพื่อดูเครื่องหมายมาร์กอัปที่สมบูรณ์
ข้อมูลดีซีเรียลไลซ์ดีซีเรียลไลซ์สามารถทำได้ง่าย ๆ โดยการเรียกเมธอดดีซีเรียลไลซ์ของคลาส XmlSerializer ส่วนย่อยของโปรแกรม VB.NET ต่อไปนี้เสร็จสิ้นการดีซีเรียลไลซ์ของเอกสาร XML ที่กล่าวถึงข้างต้น:
Dim BookObject As New Book
Dim ser As ใหม่ XmlSerializer (GetType (หนังสือ))
Dim fs เป็นระบบใหม่ IO.FileStream ("booktest.xml", FileMode.Open)
เครื่องอ่าน Dim เป็นระบบใหม่ XML.XmlTextReader (fs)
BookObject = CType(ser.Deserialize(reader), Book)
โปรแกรมนี้จะนำข้อมูลผลลัพธ์ไปไว้ในหน่วยความจำเพื่อใช้ในภายหลัง นี่คือรหัส C# ที่เทียบเท่า:
XmlSerializer ser = new XmlSerializer(typeof(Book));
System.IO.FileStreamfs = System.IO.FileStream ใหม่ ("booktest.xml",
FileMode เปิด);
เครื่องอ่าน System.Xml.XmlTextReader = System.Xml.XmlTextReader(fs) ใหม่
หนังสือ BookObject = (หนังสือ) (ser.Deserialize (เครื่องอ่าน));
-------------------------------------------------- -------------------------------------------------- - -
เกี่ยวกับผู้เขียน: Tony Patton เป็นนักพัฒนาแอปพลิเคชันมืออาชีพที่มีความรู้กว้างขวางและได้รับการรับรองใน Java, VB, Lotus และ XML