컴퓨터/C#

[C#] 객체의 XML 직렬화 (Serialization)

dolhim 2015. 7. 2. 14:57


1. 직렬화, XML 저장하기, XML 불러오기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void OpenProjectFile(string fpath)
{
    if (File.Exists(fpath))
    {
        try
        {
            using (var sr = new StreamReader(fpath))
            {
                var xs = new XmlSerializer(typeof(MyProjectInfo));
                var prj = (MyProjectInfo)xs.Deserialize(sr);
                this.project.Set(prj);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            MessageBox.Show("프로젝트 파일 로딩 실패 : " + fpath);
        }
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
public void SaveProjectFile(string fpath)
{
    var ns = new XmlSerializerNamespaces();
    ns.Add(string.Empty, string.Empty);
 
    var xs = new XmlSerializer(typeof(MyProjectInfo));
    using (var sw = new StreamWriter(fpath))
    {
        var info = new MyProjectInfo(this.project);
        xs.Serialize(sw, info, ns);
    }
}
cs



2. 속성 값 부여

 (이렇게 객체나 메소드 선언 위 줄에 대괄호를 입력하는 것을 사용자 지정 특성(Attribute)이라고 한단다. )


- element, array, array item 비교 <코드>

1
2
3
4
5
6
7
8
9
10
11
[XmlRoot("MyProject")]
public class MyProjectInfo     
{
    [XmlElement("Name")]            
    public string Name { get; set; }
    [XmlArray("ImageList")]                
    [XmlArrayItem("Image")]
    public List<MyImage> imgList { get; set; }
 
    ///...중략
}
cs


 - Ignore , attribute 비교 <코드>

1
2
3
4
5
6
7
8
9
10
11
public class MyImage
{
    [XmlAttribute("Name")]
    public string Name { get; set; }        // 영상명
    [XmlIgnore]
    public string Path { get; set; }        // 저장 경로
    [XmlAttribute("Using")]
    public bool Using { get; set; }         // 사용 여부
 
    //...중략
}
cs

프로퍼티에 [XmlIgnore] 가 붙은 것은 직렬화하지 않는다.


위 코드의 <결과.xml>


1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<MyProject>
  <Name>LM-15-07-01.lmp</Name>
  <ImageList>
    <Image Name="E2_05.JPG" Using="true" />
    <Image Name="E2_06.JPG" Using="true" />
    <Image Name="High_Quality_Image_right.tif" Using="true" />
  </ImageList>
</MyProject>
cs
<



- Attribute 의 종류와 활용 ('결과.xml'과 비교하며 읽어보기)

'MyProject' 라는 Root Node 아래에 Element Node의 이름은 'Name','ImageList' 이다. : [XmlElement]

'ImageList' 라는 Array 아래에 Item의 이름은 'Image'이다. : [XmlArray] [XmlArrayItem]

'Image' 라는 Node의 속성(Attribute)의 이름은 'Name' 과 'Using' 이다 : [XmlAttribute]