1. 직렬화의 의미
직렬화는 객체를 바이트 스트림으로 처리하여 객체를 저장하거나 메모리, 데이터베이스 또는 파일로 전송하는 것입니다. 주요 목적은 필요할 때 다시 생성할 수 있도록 개체의 상태를 저장하는 것입니다. 반대 프로세스를 역직렬화라고 합니다.
1.1 연재의 작동 방식
이 그림은 연재의 전체 과정을 보여줍니다.
객체는 스트림으로 직렬화됩니다. 스트림은 데이터뿐만 아니라 개체 버전, 문화권, 어셈블리 이름과 같은 개체 유형에 대한 정보도 전달합니다. 이 스트림을 통해 개체를 데이터베이스, 파일 또는 메모리에 저장할 수 있습니다.
직렬화용 1.2
직렬화를 통해 개발자는 객체의 상태를 저장하고 필요할 때 다시 생성할 수 있습니다. 이 객체는 객체 저장소를 제공합니다. 그리고 데이터 교환. 또한 직렬화를 통해 개발자는 웹 서비스를 통해 원격 응용 프로그램에 개체를 보내고, 한 도메인에서 다른 도메인으로 개체를 전달하고, 방화벽이나 응용 프로그램 간에 개체를 XML 문자열로 전달하는 등의 작업을 수행할 수 있습니다.
1.3 객체 직렬화 가능
객체를 직렬화하려면 직렬화할 객체, 포함할 시퀀스가 필요합니다. 개체 및 포맷터. System.Runtime.Serialization에는 개체를 직렬화 및 역직렬화하는 데 필요한 클래스가 포함되어 있습니다.
SerializedAttribute 특성을 유형에 적용하면 해당 유형의 인스턴스를 직렬화할 수 있음을 나타냅니다. 직렬화를 시도할 때 유형에 SerializedAttribute 특성이 없으면 SerializationException이 발생합니다.
클래스의 필드를 직렬화하지 않으려면 NonSerializedAttribute 특성을 적용하세요. 직렬화 가능 유형의 필드에 특정 환경에 특정한 포인터, 핸들 또는 기타 데이터 구조가 포함되어 있고 다른 환경에서 의미 있는 방식으로 재구성될 수 없는 경우 해당 필드를 직렬화 불가능하게 만들어야 할 수 있습니다.
직렬화된 클래스에 SerializedAttribute로 표시된 다른 클래스의 개체에 대한 참조가 포함되어 있으면 이러한 개체도 직렬화됩니다.
1.3.1 바이너리 직렬화 및 XML 직렬화
바이너리 직렬화 또는 XML 직렬화를 사용할 수 있습니다. 이진 직렬화에서는 모든 멤버가 직렬화되므로(읽기 전용인 경우에도) 성능이 향상될 수 있습니다. XML 직렬화는 상호 운용성을 위한 개체 공유 및 사용에 있어서 더 읽기 쉬운 코드와 더 큰 유연성을 제공합니다.
1.3.2 바이너리 직렬화
바이너리 직렬화는 바이너리 인코딩을 사용하여 저장소용 압축 직렬화를 생성하거나 소켓 기반 네트워크 스트리밍 등을 생성합니다. .
1.3.3 XML 직렬화
XML 직렬화는 객체의 공개 필드와 속성 또는 매개변수와 반환 값을 변환합니다. 특정 XSD(XML 스키마 정의 언어) 문서를 준수하는 XML 스트림으로 직렬화되는 메서드입니다. XML 직렬화는 XML로 변환되는 공용 속성 및 필드가 있는 강력한 형식의 클래스를 생성합니다. System.Xml.Serialization에는 XML을 직렬화 및 역직렬화하는 데 필요한 클래스가 포함되어 있습니다.
클래스 및 클래스 멤버에 특성을 적용하여 XmlSerializer가 클래스 인스턴스를 직렬화하거나 역직렬화하는 방법을 제어할 수 있습니다.
1.3.4 SOAP 직렬화
XML 직렬화를 사용하면 객체를 SOAP 사양을 준수하는 XML 스트림으로 직렬화할 수도 있습니다. . SOAP는 XML을 사용하여 프로시저 호출을 전송하기 위해 특별히 설계된 XML 기반 프로토콜입니다. 일반 XML 직렬화와 마찬가지로 특성을 사용하여 XML 웹 서비스에서 생성된 텍스트 스타일 SOAP 메시지를 제어할 수 있습니다.
1.3.5 기본 직렬화 및 사용자 정의 직렬화
직렬화는 기본 직렬화와 사용자 정의 직렬화의 두 가지 방법으로 수행할 수 있습니다. 기본 직렬화는 .NET Framework를 사용하여 개체를 자동으로 직렬화합니다.
1.3.5.1 기본 직렬화
기본 직렬화의 유일한 요구 사항은 개체에 SerializerableAttribute 특성이 있어야 한다는 것입니다. 적용된.
NonSerializedAttribute를 사용하여 특정 필드의 직렬화를 비활성화할 수 있습니다.
객체 버전 관리는 기본 직렬화를 사용할 때 문제를 일으킬 수 있으며, 이 경우 사용자 정의 직렬화가 더 적절할 수 있습니다. 기본 직렬화는 직렬화를 수행하는 가장 간단한 방법이지만 프로세스에 대한 많은 제어를 제공하지 않습니다.
1.3.5.2 사용자 정의 직렬화
사용자 정의 직렬화에서는 직렬화할 객체와 직렬화가 수행되는 방법을 정확하게 지정할 수 있습니다. 클래스는 SerializerableAttribute로 표시되어야 하며 ISerialized 인터페이스를 구현해야 합니다.
객체를 사용자 정의 방식으로 역직렬화하려면 사용자 정의 생성자를 사용해야 합니다.
1.3.6 디자이너 직렬화
디자이너 직렬화는 일반적으로 개발 도구와 관련된 일종의 객체 지속성을 포함하는 특수한 형태의 직렬화입니다. 디자이너 직렬화는 개체 그래프를 나중에 개체 그래프를 복원하는 데 사용할 수 있는 소스 파일로 변환하는 프로세스입니다. 소스 파일에는 코드, 마크업, SQL 테이블 정보까지 포함될 수 있습니다. 자세한 내용은 디자이너 직렬화 개요를 참조하세요.
2. 직렬화를 통해 객체 데이터 저장
객체의 속성을 디자인 타임에 기본값으로 설정할 수 있지만 객체가 손상되면 런타임에 입력된 모든 값이 삭제됩니다. 길을 잃다. 직렬화를 사용하면 인스턴스 간에 개체 데이터를 유지할 수 있으므로 다음에 개체가 인스턴스화될 때 값을 저장하고 검색할 수 있습니다.
이 연습에서는 간단한 개체를 만들고 개체의 데이터를 파일에 저장합니다. 그러면 개체를 다시 만들 때 이 파일에서 데이터가 검색됩니다. 마지막으로 SOAP 형식을 사용하여 개체를 유지하도록 코드를 수정합니다.
2.1 직렬화를 사용하여 개체 저장
[Serializable] //将类标记为可序列化 public class Coupon : INotifyPropertyChanged { public decimal Amount { get; set; } public float InterestRate { get; set; } public int Term { get; set; } private string _name; public string Name { get { return _name; } set { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Customer")); } } [field: NonSerialized()] //将可序列化的类中的某字段标记为不被序列化 public event PropertyChangedEventHandler PropertyChanged; public Coupon(decimal amount, float interestRate, int term, string name) { Amount = amount; InterestRate = interestRate; Term = term; _name = name; } } static void Main(string[] args) { const string fileName = @"demo1.txt"; var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); using (var stream = File.Create(fileName)) { var deserializer = new BinaryFormatter(); //二进制格式序列化器 deserializer.Serialize(stream, coupon); //序列化对象到文件中 } }
이제 역직렬화를 시도하여 이전 Coupon 개체의 값과 일치하는지 확인하세요.
static void Main(string[] args) { const string fileName = @"demo1.txt"; //var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); //判断该文件是否存在 if (!File.Exists(fileName)) { return; } using (var stream = File.OpenRead(fileName)) { var deserializer = new BinaryFormatter(); //二进制序列化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化 if (coupon == null) { return; } Console.WriteLine($"{nameof(Coupon)}:"); Console.WriteLine($" {nameof(coupon.Amount)}: {coupon.Amount}"); Console.WriteLine($" {nameof(coupon.InterestRate)}: {coupon.InterestRate}%"); Console.WriteLine($" {nameof(coupon.Term)}: {coupon.Term}"); Console.WriteLine($" {nameof(coupon.Name)}: {coupon.Name}"); } Console.Read(); }
2.2 SOAP 형식으로 객체 저장
static void Main(string[] args) { const string fileName = @"demo1.txt"; var coupon = new Coupon(10000, 0.2f, 1, "反骨仔"); using (var stream = File.Create(fileName)) { var deserializer = new SoapFormatter(); //Soap 格式化器 deserializer.Serialize(stream, coupon); //序列化 } }
비직렬화 SoapFormatter는
var deserializer = new SoapFormatter(); //Soap 格式化器 var coupon = deserializer.Deserialize(stream) as Coupon; //反序列化
에도 사용할 수 있습니다. [참고] 이 예에서는 데이터를 바이너리 또는 SOAP 형식 파일로 저장합니다. 비밀번호나 신용카드 정보와 같은 민감한 데이터에는 이러한 형식을 사용해서는 안 됩니다.
【참고】바이너리 형식은 대부분의 Windows 응용 프로그램에 적합합니다. 그러나 웹 응용 프로그램이나 웹 서비스의 경우 개체를 쉽게 공유할 수 있도록 SOAP 형식을 사용하여 개체를 XML 파일에 저장할 수 있습니다.
마찬가지로 XmlSerializer를 통해 객체를 직렬화하고 XML 파일로 저장할 수도 있습니다. 필요에 따라 적절한 직렬 변환기를 선택할 수 있으며 작업은 기본적으로 동일합니다.
위 내용은 C# 프로그래밍을 기반으로 한 연재 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!