C\#서열 화 와 반 서열 화의 상세 한 해석 을 깊이 이해 하 다

우리 가 C\#직렬 화 와 반 직렬 화 를 깊이 연구 하기 전에 우 리 는 먼저 직렬 화가 무엇 인지 알 아야 한다.이것 은 직렬 화 라 고도 부 르 고.NET 이 실 행 될 때 환경 이 사용자 정의 유형의 흐름 화 를 지원 하 는 체제 이다.직렬 화 는 한 대상 을 파일 이나 데이터베이스 필드 에 저장 하 는 것 이다.반 직렬 화 는 적당 한 시기 에 이 파일 을 원래 의 대상 으로 바 꾸 어 사용 하 는 것 이다.사용자 정의 대상 을 지속 적 으로 저장 하거나 한 곳 에서 다른 곳 으로 전송 하 는 것 이 목적 이다.NET 프레임 워 크 는 두 가지 직렬 화 방식 을 제공 합 니 다.1.Binary Formatter 를 사용 하여 직렬 화 합 니 다.2.SoapFormatter 를 사용 하여 직렬 화 하기;3.XmlSerializer 를 사용 하여 직렬 화 합 니 다.첫 번 째 방식 은 간단 한 바 이 너 리 데이터 흐름 과 추가 적 인 유형 정 보 를 제공 하고 두 번 째 방식 은 데이터 흐름 을 XML 저장 으로 포맷 합 니 다.세 번 째 는 사실 두 번 째 와 차이 가 많 지 않 은 것 도 XML 의 형식 저장 이다.두 번 째 XML 형식 보다 훨씬 간소화 되 었 을 뿐이다(SOAP 특유 의 추가 정 보 를 제거 했다).[Serializable]속성 을 사용 하여 클래스 표 지 를 직렬 화 할 수 있 습 니 다.만약 에 특정한 요소 가 직렬 화 되 지 않 으 려 면 1,2 는[NonSerialized]속성 으로 표시 할 수 있 고 2.[XmlIgnore]로 표시 할 수 있다.다음은 C\#직렬 화 와 반 직렬 화:C\#직렬 화 와 반 직렬 화 1,Binary Formatter 를 사용 하여 직렬 화 를 하 는 다음 과 같은 직렬 화 가능 한 클래스 입 니 다.

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 
/**//// summary 
/// ClassToSerialize  
/// /summary 
[Serializable] 
public class ClassToSerialize 

    public int id = 100; 
    public string name = "Name"; 
    [NonSerialized] 
    public string Sex = " "; 
}
다음은 직렬 화 와 반 직렬 화 방법 입 니 다.

public void SerializeNow() 

    ClassToSerialize c = new ClassToSerialize(); 
    FileStream fileStream =  
    new FileStream("c:\\temp.dat", FileMode.Create); 
    BinaryFormatter b = new BinaryFormatter(); 
    b.Serialize(fileStream, c); 
    fileStream.Close(); 

public void DeSerializeNow() 

    ClassToSerialize c = new ClassToSerialize(); 
    c.Sex = "kkkk"; 
    FileStream fileStream = 
    new FileStream("c:\\temp.dat",  
    FileMode.Open, FileAccess.Read, FileShare.Read); 
    BinaryFormatter b = new BinaryFormatter(); 
    c = b.Deserialize(fileStream) as ClassToSerialize; 
    Response.Write(c.name); 
    Response.Write(c.Sex); 
    fileStream.Close(); 
}
상기 두 가지 방법 을 호출 하면 직렬 화 결 과 를 볼 수 있 습 니 다.Sex 속성 은[NonSerialized]로 표시 되 어 있 기 때 문 입 니 다.그래서 그 값 은 항상 null 입 니 다.C\#직렬 화 와 반 직렬 화 2,SoapFormatter 를 사용 하여 직렬 화 를 하 는 것 은 Binary Formatter 와 유사 합 니 다.우 리 는 간단 한 수정 만 하면 됩 니 다.a.using 문장의'Formatter.Biary'를'Formatter.soap'으로 바 꿉 니 다.b.모든 Binary Formatter 를 SoapFormatter.c 로 바 꿉 니 다.저장 파일 의 확장 자 를.xml 로 확인 하고 위 에서 간단하게 변경 하면 SoapFormatter 의 직렬 화 를 실현 할 수 있 습 니 다.이때 발생 하 는 파일 은 xml 형식의 파일 입 니 다.C\#직렬 화 와 반 직렬 화 3.XmlSerializer 를 사용 하여 직렬 화 하 는 것 은 포맷 기 에 대해 또 하나의 문제 가 있 습 니 다.XML 이 필요 하 다 고 가정 하지만 SOAP 특유 의 추가 정 보 를 원 하지 않 는 다 면 우 리 는 어떻게 해 야 합 니까?두 가지 방안 이 있 습 니 다.IFormatter 인 터 페 이 스 를 실현 하 는 클래스 를 만 들 거나 SoapFormatter 클래스 와 유사 하지만 필요 하지 않 은 정보 가 없습니다.라 이브 러 리 XmlSerializer 를 사용 하거나,이 클래스 는 Serializable 속성 을 사용 하지 않 지만,유사 한 기능 을 제공 합 니 다.만약 에 우리 가 주류 의 직렬 화 체 제 를 사용 하지 않 고 XmlSeralizer 를 사용 하여 직렬 화 를 하려 면 수정 을 해 야 합 니 다.a.System.Xml.Seralization 네 임 스페이스 를 추가 해 야 합 니 다.b.Serializable 과 NoSerialized 속성 은 무시 되 고 XmlIgnore 속성 을 사용 합 니 다.NoSerialized 와 유사 합 니 다.c.XmlSeralizer 는 클래스 에 기본 적 인 구조 기 를 요구 합 니 다.이 조건 은 이미 만족 할 수 있 습 니 다.다음은 C\#직렬 화 와 반 직렬 화 예제:직렬 화 할 클래스:

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Xml.Serialization; 


[Serializable] 
public class Person 

    private string name; 
    public string Name 
    { 
        get
        { 
<SPAN style="WHITE-SPACE: pre"> </SPAN>    return name; 
<SPAN style="WHITE-SPACE: pre"> </SPAN>} 
<SPAN style="WHITE-SPACE: pre"> </SPAN>set
<SPAN style="WHITE-SPACE: pre"> </SPAN>{ 
<SPAN style="WHITE-SPACE: pre"> </SPAN>    name = value; 
<SPAN style="WHITE-SPACE: pre"> </SPAN>} 
    } 

 
    public string Sex; 
    public int Age = 31; 
    public Course[] Courses; 

    public Person() 
    { 
    } 
    public Person(string Name) 
    { 
<SPAN style="WHITE-SPACE: pre"> </SPAN>name = Name; 
<SPAN style="WHITE-SPACE: pre"> </SPAN>Sex = " "; 
    } 
} &nbsp;

[Serializable] 
public class Course 

    public string Name; 
    [XmlIgnore] 
    public string Description; 
    public Course() 
    { 
    } 
    public Course(string name, string description) 
    { 
<SPAN style="WHITE-SPACE: pre"> </SPAN>Name = name; 
<SPAN style="WHITE-SPACE: pre"> </SPAN>Description = description; 
    } 
}

public void XMLSerialize() 

    Person c = new Person("cyj"); 
    c.Courses = new Course[2]; 
    c.Courses[0] = new Course(" ", " "); 
    c.Courses[1] = new Course(" "," "); 
    XmlSerializer xs = new XmlSerializer(typeof(Person)); 
    Stream stream = new FileStream("c:\\cyj.XML",FileMode.Create,FileAccess.Write,FileShare.Read); 
    xs.Serialize(stream,c); 
    stream.Close(); 

public void XMLDeserialize() 

    XmlSerializer xs = new XmlSerializer(typeof(Person)); 
    Stream stream = new FileStream("C:\\cyj.XML",FileMode.Open,FileAccess.Read,FileShare.Read); 
    Person p = xs.Deserialize(stream) as Person; 
    Response.Write(p.Name); 
    Response.Write(p.Age.ToString()); 
    Response.Write(p.Courses[0].Name); 
    Response.Write(p.Courses[0].Description); 
    Response.Write(p.Courses[1].Name); 
    Response.Write(p.Courses[1].Description); 
    stream.Close(); 
}
C\#직렬 화 와 반 직렬 화 방법:

?xml version="1.0"? 
Person xmlns:xsi= 
"http://www.w3.org/2001/XMLSchema-instance"  
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  Sex /Sex 
  Age31/Age 
  Courses 
Course 
  Name /Name 
  Description /Description 
/Course 
Course 
  Name /Name 
  Description /Description 
/Course 
  /Courses 
  Namecyj/Name 
/Person
여기 Course 류 의 설명 속성 치 는 항상 null 이 고 생 성 된 xml 문서 에 도 이 노드 가 없습니다.다음 과 같 습 니 다.

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
/**//// summary 
/// Employee  
/// /summary 
[Serializable] 
public class Employee:ISerializable 

    public int EmpId=100; 
    public string EmpName=" "; 
    [NonSerialized] 
    public string NoSerialString = "NoSerialString-Test"; 
    public Employee() 
    { 
        // 
<SPAN style="WHITE-SPACE: pre"> </SPAN>// TODO:  
<SPAN style="WHITE-SPACE: pre"> </SPAN>// 
    } 
    private Employee(SerializationInfo info, StreamingContext ctxt) 
    { 
<SPAN style="WHITE-SPACE: pre"> </SPAN>EmpId = (int)info.GetValue("EmployeeId", typeof(int)); 
<SPAN style="WHITE-SPACE: pre"> </SPAN>EmpName = (String)info.GetValue("EmployeeName",typeof(string)); 
<SPAN style="WHITE-SPACE: pre"> </SPAN>//NoSerialString = (String)info.GetValue("EmployeeString",typeof(string)); 
    } 
    public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
    { 
<SPAN style="WHITE-SPACE: pre"> </SPAN>info.AddValue("EmployeeId", EmpId); 
<SPAN style="WHITE-SPACE: pre"> </SPAN>info.AddValue("EmployeeName", EmpName); 
<SPAN style="WHITE-SPACE: pre"> </SPAN>//info.AddValue("EmployeeString", NoSerialString); 
    } 
}
C\#직렬 화 와 반 직렬 화 4.사용자 정의 직렬 화 는 사용자 가 클래스 를 직렬 화 하 기 를 원 하지만 데이터 흐름 의 조직 방식 이 만 족 스 럽 지 않 으 면 사용자 정의 클래스 에서 인 터 페 이 스 를 통 해 직렬 화 행 위 를 사용자 정의 할 수 있 습 니 다.이 인 터 페 이 스 는 하나의 방법 만 있 습 니 다.GetObject Data.이 방법 은 클래스 대상 을 직렬 화 하 는 데 필요 한 데 이 터 를 SerializationInfo 대상 에 입력 하 는 데 사 용 됩 니 다.사용 하 는 포맷 기 는 SerializationInfo 대상 을 구성 한 다음 직렬 화 할 때 GetObject Data 를 호출 합 니 다.클래스 의 부모 클래스 도 ISerializable 을 실현 했다 면 GetObject Data 의 부모 클래스 를 호출해 야 합 니 다.만약 에 ISerializable 을 실현 했다 면 특정한 원형 을 가 진 구조 기 를 제공 해 야 합 니 다.이 구조 기의 매개 변수 목록 은 GetObjectData 와 같 아야 합 니 다.이 구조 기 는 부주의 한 개발 자 들 이 직접 사용 하지 않도록 개인 적 이거 나 보 호 받 는 것 으로 밝 혀 져 야 한다.예 를 들 어 다음 과 같다.C\#직렬 화 와 반 직렬 화 를 실현 하 는 ISerializable 의 유형:

public void OtherEmployeeClassTest() 

    Employee mp = new Employee(); 
    mp.EmpId = 10; 
    mp.EmpName = " "; 
    mp.NoSerialString = " "; 
    Stream steam = File.Open("c:\\temp3.dat", FileMode.Create); 
    BinaryFormatter bf = new BinaryFormatter(); 
    Response.Write("Writing Employee Info:"); 
    bf.Serialize(steam,mp); 
    steam.Close(); 
    mp = null; 
    //C#  
    Stream steam2 = File.Open("c:\\temp3.dat", FileMode.Open); 
    BinaryFormatter bf2 = new BinaryFormatter(); 
    Response.Write("Reading Employee Info:"); 
    Employee mp2 = (Employee)bf2.Deserialize(steam2); 
    steam2.Close(); 
    Response.Write(mp2.EmpId); 
    Response.Write(mp2.EmpName); 
    Response.Write(mp2.NoSerialString); 
}
C\#직렬 화 와 반 직렬 화 방법:(4567913)C\#직렬 화 와 반 직렬 화 에 대한 깊이 있 는 연 구 는 체험 과 시도 의 과정 이다.그러면 본 고 는 C\#직렬 화 와 반 직렬 화 를 이해 하고 학습 하 는 데 도움 이 되 기 를 바란다.

좋은 웹페이지 즐겨찾기