Serialization C# Serialization 321190 2012 년가을학기 11/28/2012 박경신 Serializaiton( 직렬화 ) 란객체상태를지속시키거나전송할수있는형식으로변환하는과정으로, Serialization 반대로다시객체로변환하는것을 Deserialization 임 Serialization i 을사용하는이유 객체의상태를저장소에보존했다가나중에똑같은복사본을다시만들기위하거나, 한응용프로그램에서다른응용프로그램으로객체를전송하기위해서임 닷넷에서제공하는 Serialization 방식 Binary Serialization 형식 (Type) 정확도를유지하므로응용프로그램의여러호출간에객체상태를유지하는데유용. 객체를스트림, 디스크, 메모리, 네트워크등으로 serialize 함. XML Serialization public 속성과필드만 serialize 하며형식정확도를유지하지않음. XML은공개표준이므로웹을통해데이터를공유하는데효과적인방법임. Serialization Binary Serialization Serialize하고자하는객체의 public, private 필드와클래스이름을모두바이트의스트림 (binary) 로변환하는방식이며, deserialize 되면원본객체의정확한복제본이생성 Binary Serialization 방법 기본 Serialization 클래스의일부멤버를 Serialize하는선택적 Serialization ISerializable 인터페이스를사용한사용자지정 Serialization XML/SOAP Serialization XML Serialization은객체의 public 필드와속성또는메소드의매개변수와반환값을 XML 스트림으로 Serialize하는방식으로, XML Serialization을사용하면저장이나전송을위해직렬형식으로변환되는 public 속성및필드가있는강력한형식클래스생성 XML/SOAP Serialization 방법 XML Serialization SOAP인코딩된 XML 스트림으로 Serialization 기본 Serialization 클래스를 Serializable 특성으로표시 public class MyObject { public int n1 = 0; public int n2 = 0; public string str = null; 클래스객체를 Serialize 하여파일로저장 MyObject obj = new MyObject(); // 객체생성 obj.n1 = 1; obj.n2 = 2; obj.str = test ; FileStream stream = new FileStream( TestFile.bin, FileMode.Create, FileAccess.Write, FileShare.None); // FileStream 생성 BinaryFormatter bf= new BinaryFormatter(); // BinaryFormatter 생성 bf.serialze(stream, obj); // Formatter에게 stream과객체를주고 serialize stream.close(); // FileStream 닫기 Serialize 된객체를반대로 Deserialize 로복원 BinaryFormatter bf= new BinaryFormatter(); // BinaryFormatter 생성 FileStream stream = new FileStream( TestFile.bin, FileMode.Open, FileAccess.Read); MyObject obj = (MyObject) bf.deserialze(stream); // Deserialize stream.close(); // FileStream 닫기
get { return name; set { name = value; using System.Runtime.Serialization.Formatters.Binary; textbox3.text, textbox4.text); FileStream fs = new FileStream(@ C:\Person.bin, FileMode.Create, FileAccess.Write); BinaryFormatter bf= new BinaryFormatter(); bf.serialze(fs, p); // Formatter 에게 stream 과 Person 객체를주고 serialize get { return name; set { name = value; using System.Runtime.Serialization.Formatters.Soap; textbox3.text, textbox4.text); FileStream fs = new FileStream(@ C:\Person.xml, ml FileMode.Create, FileAccess.Write); SoapFormatter sf= new SoapFormatter(); sf.serialze(fs, p); // SoapFormatter 에게 stream 과 Person 객체를주고 serialize using System.Runtime.Serialization.Formatters.Binary; List<Person> plist = new List<Person>(); FileStream fs = new FileStream(@ C:\PersonList.bin, FileMode.Create, FileAccess.Write); BinaryFormatter bf= new BinaryFormatter(); bf.serialze(fs, plist); // BinaryFormatter 에게 stream 과 Person 리스트객체를주고 serialize private void button2_click(object sender, EventArgs e) { FileStream fs = new FileStream(@ C:\PersonList.bin, FileMode.Open, FileAccess.Read); BinaryFormatter bf= new BinaryFormatter(); plist = (List<Person>)bf.Deserialze(fs); // Person 리스트 deserialize // 리스트뷰에출력 listview1.items.clear(); foreach (Person p in plist) ){ listview1.items.add(p.tolistviewitem()); 선택적 Serialization 클래스에서 serialize 하지않아야할필드를 NonSerialized 특성으로표시함으로써해당변수가 Serialize 되지않게함 public class MyObject { public int n1 = 0; [NonSerialized] [ o Se a ed] public int n2 = 0; // n2 멤버는더이상 serialize 되지않음 public string str = null;
Custom Serialization ISerializable 인터페이스를사용한사용자지정 Serialization // GetObjectData 메소드와 deserialize 될때사용되는특수생성자구현이포함되어야함 public class MyObject : ISerializable { public int n1=0; public int n2=0; public string str=null; public MyObject() { protected MyObject(SerializationInfo info, StreamingContext context) ){ n1 = info.getint32( i ); n2 = info.getint32( j ); str = info.getstring( k ); // deserialize시필요 [SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] public virtual void GetObjectData(SerializationInfo info, StreamingContext context){ info.addvalue( i, n1); info.addvalue( j, n2); info.addvalue( AddValue( k k, str); // serialize시필요 public class Person: IComparable<Person>, IEquatable<Person>, ISerializable { #region ISerializable public Person(SerializationInfo info, StreamingContext context) { this.name = info.getstring("name"); this.id = info.getint32("id"); this.phone = info.getstring("phone"); this.address = info.getstring("address"); public void GetObjectData(SerializationInfo info, StreamingContext context) { info.addvalue("name", this.name); info.addvalue("id", this.id); info.addvalue("phone", this.phone); info.addvalue("address", this.address); #endregion Custom Serialization 사용자가 Serialization을직접제어하는방식으로 ISerializable 인터페이스를사용하는방식외에, Serialization 도중과이후에데이터를수정하는데사용되는메소드에다음특성을적용 OnDeserializedAttribute OnDeserializing Attribute OnSerializedAttribute OnSerializingAttribute XML Serialization XML Serialization 특징 XML은공개표준이기때문에 XML 스트림은플랫폼에관계없이필요에따라모든응용프로그램에서처리될수있음 XML serialization 은 SOAP 사양과일치하는 XML 스트림으로객체를 serialize하는데사용할수있음 객체를 serialize하거나 deserialize 하기위해서는 XmlSerializer 클래스를사용 Serialize된데이터에는데이터자체와클래스의구조만포함 Public 속성및필드만 serialize 될수있음 만약 public 이아닌데이터를 serialize 해야하는경우 binary serialization을사용할것 클래스는 XmlSerializer에의해 serialize될기본생성자가있어야함 메소드는 serialize 될수없음
XML Serialization XmlSerializer 를사용하여 serialize/deserialize 하는방법 public class MyObject { public int n1=0; private int n2=0; public string str=null; public MyObject() { n1 = 1; n2 =2; str= XML serialization ; // 결과물인 obj.xml 에는 private 멤버와메소드의정보는기록되지않음 class Program { static void Main(string[] args) { MyObject obj = new MyObject(); // MyObject 객체생성 // XmlSerializer 생성자에 serialize하고자하는객체의타입을전달하여생성 XmlSerializer xs = new XmlSerializer(typeof(MyObject)); ( y StreamWriter sw = new StreamWriter( obj.xml ); // stream writer 생성 xs.serialize(sw, obj); // XmlSerializer에게 stream과객체를전달하여 serialize sw.close(); StreamReader sr = new StreamReader( obj.xml ); // stream reader 생성 MyObject obj2 = (MyObject) xs.deserialize(sr); // deserialize Console.WriteLine( WriteLine( n1= n1= + obj2.n1 + str= + obj2.str); sr.close(); SOAP 인코딩된 XML Serialization SOAP 인코딩된 XML Serialize하기위해서는, 새로운 SoapReflectionImporter를만들고 serialize된클래스의형식으로 ImportTypeMapping 메소드를호출하여 XmlTypeMapping 을만든뒤 XmlSerializer 생성자매개변수에전달 class Program { static void Main(string[] args) { MyObject obj = new MyObject(); // MyObject 객체생성 XmlTypeMapping xtm = new SoapReflectionImporter().ImportTypeMapping(typeof(MyObject)); XmlSerializer xs = new XmlSerializer(xtm); StreamWriter sw = new StreamWriter( obj obj.xml xml ); // stream writer 생성 xs.serialize(sw, obj); // XmlSerializer에게 stream과객체를전달하여 serialize sw.close(); [XmlType(Namespace= urn:person )] [XmlAttribute(AttributeName= Name )] get { return name; set { name = value; using System.Xml; Using System.Xml.Serialization; Serialization; textbox3.text, tbo t textbox4.text); tbo t) FileStream fs = new FileStream(@ C:\Person.xml, FileMode.Create, FileAccess.Write); XmlSerializer xs= new XmlSerializer(typeof(Person)); xs.serialze(fs, p); // XmlSerializer li 에게 stream 과 Person 객체를주고 serialize [XmlType(Namespace= urn:person )] [XmlAttribute(AttributeName= Name )] get { return name; set { name = value; using System.Xml; Using System.Xml.Serialization; textbox3.text, textbox4.text); FileStream fs = new FileStream(@ C:\Person.xml, FileMode.Create, FileAccess.Write); XmlTypeMapping xtm= new SoapReflectionImporter().ImportTypeMapping(typeof(Person)); XmlSerializer xs= new XmlSerializer(xtm); xs.serialze(fs, p); // XmlSerializer에게 stream과 Person 객체를주고 serialize
XML XML 기본 Element 와 Contents 로구성 Element는문서의구조를정의하는요소. 시작과끝태그 (Tag) 를사용하여표시 Contents는실제데이터 XML 파서 (Parser) 가필요함 www.w3.org/xml에서정의한구문규칙을사용 대표적인파서로 ms XML Core Services(MSXML) XML 문서는선택적으로문서의구조를정의하는 DTD (Document Type Definition) 또는스키마 (Schema) 를참조가능 XML 구성요소 XML 구성요소 Element 마크업태그와그안에포함된내용 Root Element 문서내모든 Element와내용을포함하고있는 XML 문서의요소 Attribute Element에포함되어추가적인정보를제공 Entity 텍스트, Binary, 비 ASCII 문자를저장하는데사용 Processing Instruction 전체문서나문서의일부를처리하는응용프로그램과연결해주는명령어 Comment ( 주석 ) XML 프로세서가해석하지않는설명문 CDATA Section 모든문자를마크업이나태그로인식하지않고일반문자로인식할수있는표기법. 즉, 특수한문자를일반텍스트로인식하도록하는표기법 XML Element XML Attribute public class Person { [XmlElement("Name")] get; set; [XmlElement( ID")] public int ID { get; set;.. <Person> <Name>Park </Name> <ID>1207</ID> <Phone> 000-111-2222</Phone> <Address> 단국대학교 </Address> </Person> 19 public class Person { [XmlAttribute(AttributeName="Name")] get; set; [XmlAttribute(AttributeName= ID")] public int ID { get; set;.. <Person Name= Park ID= 1207 Phone= 000-111- 2222 Address= 단국대학교 /> 20
XML 구성요소 처리명령 (Processing Instruction) <? 와?> 사이에표현되고특정응용프로그램에대해처리할정보나명력을가리키는역할 <?xml:stylesheet type="text/xsl" text/xsl href=" 메모.xsl xsl"?> XML 의스타일쉬트를지정하고, 타입은 test/xsl이며, 소스는메모.xsl에있다는의미 주석 (Comment) <!- - 와 - -> 사이에정의되고주석처리로사용 <!-- <Person Name= Park ID= 1207 Phone= 000-111-2222 Address= 단국대학교 />--> CDATA 섹션 (CDATA Section) <![CDATA[ 와 ]]> 사이에정의되고그안의내용을문자열로사용 <![CDATA[<Person Name= Park ID= 1207 Phone= 000-111- 2222 Address= 단국대학교 />]]> 21