XmlSerializer 개체의 Xml 직렬화 및 역직렬화에 대한 샘플 코드 분석

黄舟
풀어 주다: 2017-03-09 16:57:01
원래의
1523명이 탐색했습니다.

이 에세이에 해당하는 .Net 네임스페이스는 System.Xml.Serialization입니다. 기사의 샘플 코드는 이 네임스페이스를 참조해야 합니다.

직렬화와 역직렬화는 왜 필요한가요?

.Net 프로그램이 실행될 때 개체는 메모리에 상주합니다. 메모리에 있는 개체를 사용하기 위해 다른 시스템으로 전달해야 하거나 종료할 때 저장해야 하는 경우 프로그램이 다시 시작되면 다시 사용할 수 있습니다. 직렬화 및 역직렬화가 필요합니다.

범위: 이 기사에서는 XML 직렬화만 소개합니다. 실제로 직렬화는 바이너리 직렬화일 수도 있고 다른 형식의 직렬화일 수도 있습니다.

가장 간단한 XML 직렬화 코드를 살펴보세요

class Program
{
    static void Main(string[] args)
    {
        int i = 10;
        //声明Xml序列化对象实例serializer
        XmlSerializer serializer = new XmlSerializer(typeof(int));
        //执行序列化并将序列化结果输出到控制台
        serializer.Serialize(Console.Out, i);
        Console.Read();
    }
}
로그인 후 복사

위 코드는 int i 직렬화를 수행하고, 직렬화 결과를 콘솔에 출력하면 출력 결과는 다음과 같습니다.

<?xml version="1.0" encoding="gb2312"?>
<int>10</int>
로그인 후 복사

위 코드는 xml 직렬화 및 역직렬화 프로세스를 가장 간단한 방법으로 보여줍니다. Net 시스템 클래스 라이브러리는 우리를 위해 많은 작업을 수행했으며 직렬화와 역직렬화 모두 매우 간단합니다. 그러나 실제로는 비즈니스 요구 사항이 더 복잡한 경우가 많으며 단순히 int 변수를 직렬화하는 것은 불가능합니다. 표시하는 동안 복잡한 유형을 제어 가능하게 직렬화해야 합니다.

사용자 정의 개체의 XML 직렬화:

System.Xml.Serialization 네임스페이스에는 복잡한 유형의 직렬화를 제어하는 ​​일련의 기능 클래스가 있습니다. 예를 들어 XmlElementAttribute, XmlAttributeAttribute, XmlArrayAttribute, XmlArrayItemAttribute, XmlRootAttribute 등이 있습니다.

작은 예를 들어보세요. 사용자 정의 클래스 Cat이 있습니다. Cat 클래스에는 Color, Saying, Speed라는 세 가지 속성이 있습니다.

static void Main(string[] args)
{
    using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?>
<int>10</int>"))
    {
        //声明序列化对象实例serializer 
        XmlSerializer serializer = new XmlSerializer(typeof(int));
        //反序列化,并将反序列化结果值赋给变量i
        int i = (int)serializer.Deserialize(rdr);
        //输出反序列化结果
        Console.WriteLine("i = " + i);
        Console.Read();
    }
}
로그인 후 복사

XmlElement를 사용하여 하위 노드로 직렬화할 특성을 지정하거나(기본적으로 하위 노드로 직렬화됨) XmlAttribute 특성을 사용할 수 있습니다. 노드의 Xml 속성으로 직렬화할 속성을 지정하려면 XmlIgnore 속성을 통해 수정된 속성을 직렬화하지 않도록 직렬 변환기에 요청할 수도 있습니다.

객체 배열의 XML 직렬화:


Xml 배열의 직렬화에는 XmlArrayAttribute를 사용해야 하며 XmlArrayItemAttribute는 배열 요소를 지정합니다. Xml 노드 이름, XmlArrayItemAttribute는 배열 요소의 Xml 노드 이름을 지정합니다.

다음 코드 예:

namespace UseXmlSerialization
{
    class Program
    {
        static void Main(string[] args)
        {
            //声明一个猫咪对象
            var c = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            //序列化这个对象
            XmlSerializer serializer = new XmlSerializer(typeof(Cat));

            //将对象序列化输出到控制台
            serializer.Serialize(Console.Out, c);

            Console.Read();
        }
    }

    [XmlRoot("cat")]
    public class Cat
    {
        //定义Color属性的序列化为cat节点的属性
        [XmlAttribute("color")]
        public string Color { get; set; }

        //要求不序列化Speed属性
        [XmlIgnore]
        public int Speed { get; set; }

        //设置Saying属性序列化为Xml子元素
        [XmlElement("saying")]
        public string Saying { get; set; }
    }
}
로그인 후 복사

위 코드는 다음을 출력합니다.

/*玉开技术博客 http://www.php.cn/ */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace UseXmlSerialization
{
    class Program
    {
        static void Main(string[] args)
        {
            //声明一个猫咪对象
            var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };
            var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} };

            //序列化这个对象
            XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));

            //将对象序列化输出到控制台
            serializer.Serialize(Console.Out, cc);

            Console.Read();
        }
    }

    [XmlRoot("cats")]
    public class CatCollection
    {
        [XmlArray("items"),XmlArrayItem("item")]
        public Cat[] Cats { get; set; }
    }

    [XmlRoot("cat")]
    public class Cat
    {
        //定义Color属性的序列化为cat节点的属性
        [XmlAttribute("color")]
        public string Color { get; set; }

        //要求不序列化Speed属性
        [XmlIgnore]
        public int Speed { get; set; }

        //设置Saying属性序列化为Xml子元素
        [XmlElement("saying")]
        public string Saying { get; set; }
    }
}
로그인 후 복사

XmlSerializer 메모리 누수 문제:

고마워요 chenlulouis, msdn을 주의 깊게 살펴보니 실제로 msdn 설명이 누수가 있는 걸 발견했습니다. 동적으로 생성된 어셈블리

성능 향상을 위해 XML 직렬화 인프라는 지정된 유형을 직렬화 및 역직렬화하는 어셈블리를 동적으로 생성합니다. 이 인프라는 이러한 어셈블리를 찾아 재사용합니다. 이 동작은 다음 생성자를 사용할 때만 발생합니다.

XmlSerializer(Type)XmlSerializer.XmlSerializer(Type, String)
다른 생성자를 사용하면 동일한 프로그램이 생성됩니다. 세트 버전이 있고 언로드되지 않습니다. 이로 인해 메모리 누수가 발생하고 성능이 저하됩니다. 가장 간단한 해결책은 앞서 언급한 두 생성자 중 하나를 사용하는 것입니다. 그렇지 않으면 다음 예제와 같이 어셈블리를 Hashtable에 캐시해야 합니다.




즉, XmlSerializer 개체를 초기화할 때 다음 두 생성자를 사용하는 것이 가장 좋습니다. 그렇지 않으면 메모리 누수가 발생합니다.
XmlSerializer(유형)
XmlSerializer >

위 내용은 XmlSerializer 개체의 Xml 직렬화 및 역직렬화에 대한 샘플 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿