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 ">
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();
}
}
}
실행 결 과 는 다음 과 같 습 니 다.
메모: 반 직렬 화 복원 대상 시 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) 을 조합 하여 인터넷 의 다양한 운영 환경 에서 분포 식 대상 을 사용 하 는 표준 방법 을 정의 합 니 다.)그 내용 은 다음 과 같다.
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 ">
메모: xml 직렬 화 방식 으로 Public 필드 와 읽 기 가능 한 속성 만 저장 할 수 있 으 며, private 등 유형의 필드 는 직렬 화 할 수 없습니다.