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.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 = " ";
}
}
[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\#직렬 화 와 반 직렬 화 를 이해 하고 학습 하 는 데 도움 이 되 기 를 바란다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.