집 >백엔드 개발 >XML/RSS 튜토리얼 >XMLSerializer를 사용하여 객체를 XML로 직렬화
Microsoft는 데이터 직렬화의 중요성을 깨달았으므로 .NET 프레임워크에는 System.Runtime.Serialization 및 System.xml.Serialization 네임스페이스가 포함되어 직렬화 기능을 제공하고 사용자가 자신의 직렬화 방법을 작성할 수 있도록 하는 프레임워크를 제공합니다. System.Xml.Serialization 네임스페이스는 개체를 XML 형식으로 직렬화하기 위한 기본 메서드를 제공합니다. 이 방법을 어떻게 사용하는지 살펴보겠습니다.
XML의 매력
직렬화된 XML은 저장이나 전송 과정의 편의를 위해 객체의 공개 필드와 속성을 직렬 형식(여기서는 XML 형식)으로 저장하는 것을 말합니다. 역직렬화는 직렬 상태 정보를 사용하여 개체를 직렬 XML 상태에서 원래 상태로 복원하는 프로세스입니다. 따라서 직렬화를 개체의 상태를 스트림이나 버퍼에 저장하는 방법으로 생각할 수 있습니다.
직렬화의 목적은 데이터 저장과 데이터 변환입니다. 데이터 저장은 사용자 세션 전반에 걸쳐 데이터를 저장하는 것을 의미합니다. 애플리케이션이 닫히면 데이터가 저장되고(직렬화), 사용자가 돌아오면 데이터가 다시 로드됩니다(직렬화 해제). 데이터 변환은 데이터를 다른 시스템에서 이해할 수 있는 형식으로 변환하는 것을 의미합니다. 직렬화 및 XML을 사용하면 데이터 변환을 쉽게 수행할 수 있습니다.
개체의 데이터는 클래스, 메서드, 속성, 전용 유형, 배열일 수 있으며 System.Xml.XmlElement 또는 System.Xml.XmlAttribute 개체에 포함된 XML일 수도 있습니다.
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 클래스의 Serialize 메서드에서 구현됩니다. 이 메서드를 사용하면 직렬화 중에 TextWriter, Stream 및 XmlWriter 개체를 호출할 수 있습니다. 다음 예제 코드는 이 메서드를 호출하는 방법을 보여줍니다. 이 예에서는 객체가 직렬화되어 로컬 디스크의 파일에 저장됩니다. 예제는 클래스 선언으로 시작하고 직렬화된 소스 코드가 이어집니다.
using System; namespace BuilderSerialization { public class Address { public Address() {} public string Address1; public string Address2; public string City; public string State; public string Zip; public string Country; } } using System; namespace BuilderSerialization { public class Author { public Author() { } public string FirstName; public string MiddleName; public string LastName; public string Title; public string Gender; public Address AddressObject; } } namespace BuilderSerialization { public class Book { public Book() { } public string Title; public Author AuthorObject; public string ISBN; public double RetailPRice; public string Publisher; }} using System; using System.Xml.Serialization; using System.IO; namespace BuilderSerialization { class TestClass { static void Main(string[] args) { Book BookObject = new Book(); XmlSerializer ser = new XmlSerializer(typeof(Book)); TextWriter writer = new StreamWriter("booktest.xml"); BookObject.Title = "Practical LotusScript"; BookObject.ISBN = "1884777767 "; BookObject.Publisher = "Manning Publications"; BookObject.RetailPrice = 43.95; BookObject.AuthorObject = new Author(); BookObject.AuthorObject.FirstName = "Tony"; BookObject.AuthorObject.LastName = "Patton"; BookObject.AuthorObject.Gender = "Male"; BookObject.AuthorObject.AddressObject = new Address(); BookObject.AuthorObject.AddressObject.Address1 = "1 Main Street"; BookObject.AuthorObject.AddressObject.City = "Anywhere"; BookObject.AuthorObject.AddressObject.State = "KY"; BookObject.AuthorObject.AddressObject.Zip = "40000"; BookObject.AuthorObject.AddressObject.Country = "USA"; ser.Serialize(writer, BookObject); writer.Close(); } } }
위 코드는 세 개의 객체를 하나의 객체로 변환하여 직렬화 과정에서 XML 파일을 생성합니다. 다음은 예제 프로그램에서 생성된 XML 문서입니다.
<?xml version="1.0" encoding="utf-8"?> <Book xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Title>Practical LotusScript</Title> <AuthorObject> <FirstName>Tony</FirstName> <LastName>Patton</LastName> <Gender>Male</Gender> <AddressObject> <Address1>1 Main Street</Address1> <City>Anywhere</City> <State>KY</State> <Zip>40000</Zip> <Country>USA</Country> </AddressObject> </AuthorObject> <ISBN>1884777767 </ISBN> <RetailPrice>43.95</RetailPrice> <Publisher>Manning Publications</Publisher> </Book>
직렬화 프로세스에서는 객체 데이터의 중첩도 처리할 수 있습니다. 데이터는 인식 가능한 형식으로 변환되어 데이터 다시 로드(역직렬화) 및 다른 시스템으로의 데이터 전송이 용이해집니다. 데이터 전송 프로세스 중에 수신 시스템은 XML 파일의 형식을 알아야 합니다(미리 알 수 없는 경우). 따라서 XML 스키마 파일을 제공해야 합니다. .NET Framework의 XSD.exe 도구는 직렬화된 XML에 대한 스키마 파일을 생성할 수 있습니다.
다음은 VB.NET으로 작성된 예제 코드입니다.
Public Class Address Public Address1 As String Public Address2 As String Public City As String Public State As String Public Zip As String Public Country As String End Class Public Class Author Public FirstName As String Public MiddleName As String Public LastName As String Public Title As String Public Gender As String Public AddressObject As Address End Class Public Class Book Public AuthorObject As Author Public Title As String Public ISBN As String Public RetailPrice As Double Public Publisher As String End Class Imports System.Xml.Serialization Imports System.IO Module Module1 Sub Main() Dim BookObject As New Book Dim ser As New XmlSerializer(GetType(Book)) Dim writer As New StreamWriter("booktest.xml") With BookObject .Title = "Practical LotusScript" .ISBN = "1884777767 " .Publisher = "Manning Publications" .RetailPrice = 43.95 .AuthorObject = New Author .AuthorObject.FirstName = "Tony" .AuthorObject.LastName = "Patton" .AuthorObject.Gender = "Male" .AuthorObject.AddressObject = New Address .AuthorObject.AddressObject.Address1 = "1 Main Street" .AuthorObject.AddressObject.City = "Anywhere" .AuthorObject.AddressObject.State = "KY" .AuthorObject.AddressObject.Zip = "40000" .AuthorObject.AddressObject.Country = "USA" End With ser.Serialize(writer, BookObject) writer.Close() End Sub End Module
제어 출력
직렬화 프로세스는 표준 XML 파일을 생성하고 데이터 멤버는 XML로 변환됩니다. 강요. 그러나 모든 데이터 멤버가 요소가 되는 것은 아닙니다. 클래스 코드에 일부 태그를 추가하여 출력 XML 파일을 제어할 수 있습니다. 이런 방식으로 데이터 멤버를 요소가 아닌 XML 특성으로 변환하거나 간단히 무시할 수 있습니다. 다음 예제는 수정된 책 클래스 VB.NET 코드입니다.
Public Class Book Public AuthorObject As Author Public Title As String <System.Xml.Serialization.XmlAttribute()> _ Public ISBN As String <System.Xml.Serialization.XmlIgnoreAttribute()> _ Public RetailPrice As Double Public Publisher As String End Class
이 코드는 XML 파일을 생성할 때 클래스 멤버 ISBN을 XML 속성으로 사용하고 RetailPrice 멤버는 무시하도록 시스템에 지시합니다. 이 변경 사항은 생성된 XML 파일에서 확인할 수 있습니다.
<?xml version="1.0" encoding="utf-8"?> <Book xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ISBN="1884777767 "> <AuthorObject> <FirstName>Tony</FirstName> <LastName>Patton</LastName> <Gender>Male</Gender> <AddressObject> <Address1>1 Main Street</Address1> <City>Anywhere</City> <State>KY</State> <Zip>40000</Zip> <Country>USA</Country> </AddressObject> </AuthorObject> <Title>Practical LotusScript</Title> <Publisher>Manning Publications</Publisher> </Book>
다음은 해당 C# 코드입니다.
public class Book { public Book() { } public string Title; public Author AuthorObject; [System.Xml.Serialization.XmlAttribute()] public string ISBN; [System.Xml.Serialization.XmlIgnoreAttribute()] public double RetailPrice; public string Publisher; }
위에서는 두 마크업 기호에 대해 약간만 언급합니다. 전체 마크업 표기법은 .NET 설명서를 참조하세요.
역직렬화
XmlSerializer 클래스의 Deserialize 메서드를 호출하면 역직렬화된 데이터를 쉽게 얻을 수 있습니다. 다음 VB.NET 프로그램 조각은 위에서 언급한 XML 문서의 역직렬화를 완료합니다.
Dim BookObject As New Book Dim ser As New XmlSerializer(GetType(Book)) Dim fs As New System.IO.FileStream("booktest.xml", FileMode.Open) Dim reader As New System.XML.XmlTextReader(fs) BookObject = CType(ser.Deserialize(reader), Book) 该程序把结果数据放入内存备用。下面是等价的C# 代码: XmlSerializer ser = new XmlSerializer(typeof(Book)); System.IO.FileStreamfs = new System.IO.FileStream("booktest.xml", FileMode.Open); System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(fs); Book BookObject = (Book)(ser.Deserialize(reader));
위는 XMLSerializer를 사용하여 객체를 XML로 직렬화하는 내용입니다. 자세한 내용은 PHP 중국어를 참고하세요. 홈페이지(www.php.cn)!