C \ # 직렬 화 와 반 직렬 화

11913 단어 역 직렬 화
검증
Person 의 Name 속성 을 Private 로 변경 한 다음 생 성 된 personInfo. text 를 봅 니 다. 그 내용 은 다음 과 같 습 니 다.
< Person xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance " xmlns:xsd=" http://www.w3.org/2001/XMLSchema ">   200719   man   22 < /Person>
Name 속성 이 이 파일 에 나타 나 지 않 았 음 을 볼 수 있 습 니 다. 역 직렬 화 된 대상 에서 Name 속성 값 은 NULL 입 니 다.
이상 은 c \ # 직렬 화 와 반 직렬 화 세 가지 방식 에 대해 예 를 들 어 설명 하 였 다.물론 하나의 클래스 에서 속성 이 직렬 화 되 거나 직렬 화 되 지 않 는 것 을 결정 할 수 있 습 니 다. NonSerialized 속성 으로 구성원 변 수 를 표시 하여 직렬 화 되 는 것 을 방지 할 수 있 습 니 다. 구체 적 인 내용 은 관련 자 료 를 찾 아 보 세 요.
 
     직렬 화 는 대상 인 스 턴 스 의 상 태 를 저장 매체 에 저장 하 는 과정 을 말한다.이 과정 에서 대상 의 공공 필드 와 개인 필드, 클래스 의 이름 (클래스 가 있 는 프로그램 집합 포함) 을 바이트 흐름 으로 바 꾼 다음 에 바이트 흐름 을 데이터 흐름 에 기록 합 니 다.이후 대상 을 역 직렬 화 할 때 원래 대상 과 똑 같은 복사 본 을 만 듭 니 다.
     우 리 는 항상 대상 의 필드 값 을 디스크 에 저장 하고 나중에 이 데 이 터 를 검색 해 야 한다.직렬 화 를 사용 하지 않 아 도 이 일 을 완성 할 수 있 지만 이런 방법 은 번 거 롭 고 실수 하기 쉬 우 며 대상 의 차원 구 조 를 추적 해 야 할 때 점점 복잡 해진 다.많은 대상 을 포함 하 는 대형 비 즈 니스 프로그램 을 만 드 는 상황 을 상상 할 수 있 습 니 다. 프로그래머 는 필드 와 속성 을 디스크 에 저장 하고 디스크 에서 이 필드 와 속성 을 복원 할 수 있 도록 모든 대상 에 게 코드 를 만들어 야 합 니 다.직렬 화 는 이 목 표를 쉽게 실현 할 수 있 는 빠 른 방법 을 제공 했다.
     .NET 공용 언어 가 실 행 될 때 (CLR) 관리 대상 이 메모리 에 분포 되 고. NET 프레임 워 크 는 반 사 를 통 해 자동 직렬 화 메커니즘 을 제공한다.대상 이 직렬 화 되면 클래스 의 이름, 프로그램 집합, 인 스 턴 스 의 모든 데이터 구성원 이 저장 매체 에 기 록 됩 니 다.대상 은 보통 구성원 변수 로 다른 인 스 턴 스 에 대한 인용 을 저장 합 니 다.클래스 직렬 화 후 직렬 화 엔진 은 같은 대상 이 여러 번 직렬 화 되 지 않도록 모든 직렬 화 된 인용 대상 을 추적 합 니 다.NET 프레임 워 크 가 제공 하 는 직렬 화 시스템 구 조 는 대상 도표 와 순환 인용 을 자동 으로 정확하게 처리 할 수 있 습 니 다.대상 도표 에 대한 유일한 요 구 는 서열 화 되 고 있 는 대상 이 인용 하 는 모든 대상 을 Serializable 로 표시 해 야 한 다 는 것 이다. (기본 서열 화 참조)그렇지 않 으 면 직렬 화 프로그램 이 표시 되 지 않 은 대상 을 직렬 화 하려 고 할 때 이상 이 발생 할 수 있 습 니 다.
역 직렬 화 된 클래스 를 다시 만 들 고 모든 데이터 구성원 의 값 을 자동 으로 복원 합 니 다.
     C \ # 에서 흔히 볼 수 있 는 서열 화 방법 도 세 가지 가 있 는데 그것 이 바로 Binary Formatter, SoapFormatter, XML 서열 화 이다.본 고 는 작은 예 를 통 해 주로 이 세 가지 방법의 구체 적 인 사용 과 공통점 을 말한다.
vs 2008 콘 솔 프로젝트 Serializable Test 를 새로 만 듭 니 다. Person 클래스 를 추가 하고 [Serializable] 을 추가 하여 직렬 화 할 수 있 습 니 다.
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace SerializableTest

{

    [Serializable]

    public class Person

    {

        public string Sno { get; set; }

        public string Name { get; set; }

        public string Sex { get; set; }

        public int Age { get; set; }

        public string DisplayInfo()

        {

            return "     :" +Sno+ "
:"+Name + "
:"+Sex+"
:"+Age+"
"; } } }

1. Binary Formatter 직렬 화 방식
1. 직렬 화: Person 대상 me 를 새로 만 든 다음 파일 personInfo. txt 에 직렬 화 저장 합 니 다.]
var me = new Person

                         {

                             Sno = "200719",

                             Name = "yuananyun",

                             Sex="man",

                             Age=22

                         };

            //            

            IFormatter formatter = new BinaryFormatter();

            //       

            Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

            formatter.Serialize(stream, me);

            stream.Close();


이 코드 를 실행 하면 personInfo. txt 파일 을 만 들 것 입 니 다. me 대상 의 프로그램 집합 정보, 클래스 이름과 필드 정 보 를 포함 합 니 다.
2. 역 직렬 화: 파일 personInfo. txt 에서 대상 을 복원 합 니 다.
 //    

        Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open,

            FileAccess.Read, FileShare.Read);

            var stillme = (Person)formatter.Deserialize(destream);

            stream.Close();


전체 프로그램 은 다음 과 같 습 니 다.
using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;

namespace SerializableTest

{

    class Program

    {

        static void Main(string[] args)

        {

            //            

            IFormatter formatter = new BinaryFormatter();

            Console.WriteLine("       ……");

            var me = new Person

                         {

                             Sno = "200719",

                             Name = "yuananyun",

                             Sex="man",

                             Age=22

                         };

            //       

            Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

            formatter.Serialize(stream, me);

            stream.Close();

            Console.WriteLine("     !
"); Console.WriteLine(" ……"); // Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open, FileAccess.Read, FileShare.Read); var stillme = (Person)formatter.Deserialize(destream); stream.Close(); Console.WriteLine(" , ……"); Console.WriteLine(stillme.DisplayInfo()); Console.ReadKey(); } } }

실행 결 과 는 다음 과 같 습 니 다.
C#序列化与反序列化
메모: 반 직렬 화 복원 대상 시 Person 류 의 구조 함 수 를 호출 하지 않 습 니 다.
2. SoapFormatter 직렬 화 방식
Binary Formatter 직렬 화 방식 과 유사 합 니 다. IFormatter formatter = new Binary Formatter () 를 IFormatter formatter = new SoapFormatter () 로 바 꾸 고 프로그램 집합 System. Runtime. Serialization. Formatters. Soap. dll (. net 자체) 을 참조 하 십시오.
using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Soap;

namespace SerializableTest

{

    class Program

    {

        static void Main(string[] args)

        {

            //            

            IFormatter formatter = new SoapFormatter();

            Console.WriteLine("       ……");

            var me = new Person

                         {

                             Sno = "200719",

                             Name = "yuananyun",

                             Sex="man",

                             Age=22

                         };

            //       

            Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

            formatter.Serialize(stream, me);

            stream.Close();

            Console.WriteLine("     !
"); Console.WriteLine(" ……"); // Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open, FileAccess.Read, FileShare.Read); var stillme = (Person)formatter.Deserialize(destream); stream.Close(); Console.WriteLine(" , ……"); Console.WriteLine(stillme.DisplayInfo()); Console.ReadKey(); } } }

결 과 는 첫 번 째 방식 과 같다.
직렬 화 된 파일 은 Soap 형식의 파일 (Simple Object Access Protocol, SOAP) 입 니 다. 가 볍 고 간단 하 며 XML 기반 프로 토 콜 로 WEB 에서 구조 화 되 고 고 화 된 정 보 를 교환 하도록 설계 되 었 습 니 다. SOAP 는 기 존의 많은 인터넷 프로 토 콜 과 형식 을 결합 하여 사용 할 수 있 습 니 다. 하이퍼텍스트 전송 프로 토 콜 (HTTP) 을 포함 합 니 다.간단 한 메 일 전송 프로 토 콜 (SMTP), 다 용도 인터넷 메 일 확장 프로 토 콜 (MIME). 메시지 시스템 부터 원 격 프로 세 스 호출 (RPC) 까지 다양한 애플 리 케 이 션 을 지원 합 니 다. SOAP 는 XML 기반 데이터 구조 와 하이퍼텍스트 전송 프로 토 콜 (HTTP) 을 조합 하여 인터넷 의 다양한 운영 환경 에서 분포 식 대상 을 사용 하 는 표준 방법 을 정의 합 니 다.)그 내용 은 다음 과 같다.
http://www.w3.org/2001/XMLSchema-instance " xmlns:xsd=" http://www.w3.org/2001/XMLSchema " xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ " xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ " xmlns:clr=" http://schemas.microsoft.com/soap/encoding/clr/1.0 " SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "> < SOAP-ENV:Body> < a1:Person id="ref-1" xmlns:a1=" http://schemas.microsoft.com/clr/nsassem/SerializableTest/SerializableTest%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull "> < _x003C_Sno_x003E_k__BackingField id="ref-3">200719 < _x003C_Name_x003E_k__BackingField id="ref-4">yuananyun < _x003C_Sex_x003E_k__BackingField id="ref-5">man < _x003C_Age_x003E_k__BackingField>22 < / a1: Person > < / SOAP - ENV: Body > < / SOAP - ENV: Envelope > 3, XML 서열 화 방식
using System;

using System.IO;

using System.Runtime.Serialization;

using System.Xml.Serialization;

namespace SerializableTest

{

    class Program

    {

        static void Main(string[] args)

        {

            //            

            XmlSerializer formatter = new XmlSerializer(typeof(Person));

            Console.WriteLine("       ……");

            var me = new Person

                         {

                             Sno = "200719",

                             Name = "yuananyun",

                             Sex="man",

                             Age=22

                         };

            //       

            Stream stream = new FileStream("c:/personInfo.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

            formatter.Serialize(stream, me);

            stream.Close();

            Console.WriteLine("     !
"); Console.WriteLine(" ……"); // Stream destream = new FileStream("c:/personInfo.txt", FileMode.Open, FileAccess.Read, FileShare.Read); var stillme = (Person)formatter.Deserialize(destream); stream.Close(); Console.WriteLine(" , ……"); Console.WriteLine(stillme.DisplayInfo()); Console.ReadKey(); } } }

결 과 는 상기 와 같 습 니 다. xml 직렬 화 된 파일 은 일반적인 xml 파일 입 니 다. personInfo. txt 내용 은 다음 과 같 습 니 다.
< Person xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance " xmlns:xsd=" http://www.w3.org/2001/XMLSchema ">   200719   yuananyun   man   22 < /Person>
메모: xml 직렬 화 방식 으로 Public 필드 와 읽 기 가능 한 속성 만 저장 할 수 있 으 며, private 등 유형의 필드 는 직렬 화 할 수 없습니다.

좋은 웹페이지 즐겨찾기