首頁  >  文章  >  後端開發  >  C# 中的反序列化

C# 中的反序列化

王林
王林原創
2024-09-03 15:25:14463瀏覽

以下文章提供了 C# 中反序列化的概述。我們先來看看序列化的過程。序列化是將物件轉換為某種形式的過程,以便可以將其寫入流中並儲存在記憶體、資料庫或檔案中。它的主要用途是儲存物件的狀態。

現在,反序列化是與序列化相反的過程。它是將位元組流讀取或轉換回物件以便將其載入到記憶體中的過程。這個過程使我們能夠在需要時重建物件。

文法及解釋:

使用BinaryFormatter進行反序列化的語法如下:

FileStream fileStream = new FileStream(filePath, FileMode.Open);
BinaryFormatter binaryFormatter = new BinaryFormatter();
ClassName objectName = (ClassName)binaryformatter.Deserialize(fileStream);

在上面的語法中,首先,我們透過給出檔案路徑(filePath)建立了一個 FileStream(fileStream)對象,我們將從中獲取資訊以重建對象。之後,我們建立了一個 BinaryFormatter 物件。 BinaryFormatter 是 System.Runtime.Serialization.Formatters.Binary 命名空間下的一個類,用於序列化和反序列化物件。然後,我們使用 BinaryFormatter 的 Deserialize() 方法反序列化該對象,該方法以 FileStream 物件作為輸入並返回一個對象,我們將其轉換為 ClassName 類型的對象,然後將其儲存在 objectName 中。

C# 中的反序列化如何運作?

對於 C# 中的反序列化,我們需要先在程式碼中匯入 System.IO 命名空間,以開啟包含將用於重建物件的資料的檔案。然後我們需要匯入 System.Runtime.Serialization.Formatters.Binary 命名空間來使用 BinaryFormatter 類,該類別將負責序列化和反序列化物件。

假設我們有一個名為「Student」的類,它有兩個屬性,即「Name」和「RollNo」。我們將使用序列化過程將類別“Student”資料屬性寫入檔案。然後透過呼叫 BinaryFormatter 類別的 Deserialize() 方法,我們可以從該檔案中讀取資料並重建「Student」類別的對象,我們稱之為物件的反序列​​化。

使用 BinaryFormatter 在 C# 中反序列化物件的步驟如下:

  • 首先,我們必須建立一個流物件來讀取序列化的資訊或資料。
  • 然後,我們將建立一個 BinaryFormatter 類別的物件。
  • 之後,我們將呼叫 BinaryFormatter 類別的 Deserialize() 方法來反序列化該物件。此方法將傳回一個我們可以轉換為適當類型的物件。

在 C# 中,序列化分為三種:

  • 二進位序列化
  • XML 序列化
  • JSON 序列化

因此,根據序列化完成的情況,我們可以透過三種方式反序列化物件。對於二進位序列化和反序列化,我們使用上面討論的 BinaryFormatter 類別;對於 XML 序列化和反序列化,我們使用 XMLSerializer 類別;對於 JSON 序列化和反序列化,我們使用 JsonSerializer 類別。

C# 中序列化與反序列化的圖示:

 

C# 中的反序列化

C# 中反序列化的範例

以下是範例:

範例#1

顯示二進位序列化和反序列化的範例。

代碼:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApp4
{
class Program
{
public static void SerializingData()
{
string str = "Hello world!";
FileStream fileStream = new FileStream(@"E:\Content\content.txt",
FileMode.Create);
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(fileStream, str);
fileStream.Close();
}
public static void DeserializingData()
{
FileStream fileStream = new FileStream(@"E:\Content\content.txt",
FileMode.Open);
BinaryFormatter binaryFormatter = new BinaryFormatter();
string content = "";
content = (string)binaryFormatter.Deserialize(fileStream);
fileStream.Close();
Console.WriteLine("Deserialized data: ");
Console.WriteLine(content);
}
static void Main(string[] args)
{
SerializingData();
DeserializingData();
Console.ReadLine();
}
}
}<strong> </strong>

輸出:

C# 中的反序列化

範例#2

顯示自訂類別的二進位序列化和反序列化的範例。

代碼:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApp4
{
[Serializable]
public class Student
{
public int RollNo;
public string Name;
public string Address;
public Student(int rollNo, string name, string address)
{
RollNo = rollNo;
Name = name;
Address = address;
}
}
public class Program
{
public static void SerializingData()
{
Student student = new Student(1, "Sneha", "Kasarwadi, Pune");
//creating file to store data
FileStream fileStream = new FileStream(@"E:\Content\Student.txt",
FileMode.Create);
BinaryFormatter binaryFormatter = new BinaryFormatter();
//serializing data using Serialize() method
binaryFormatter.Serialize(fileStream, student);
fileStream.Close();
}
public static void DeserializingData()
{
Student student;
//opening file to read data
FileStream fileStream = new FileStream(@"E:\Content\Student.txt",
FileMode.Open);
BinaryFormatter binaryFormatter = new BinaryFormatter();
//creating object to store deserialized data
student = (Student)binaryFormatter.Deserialize(fileStream);
int rollNo = student.RollNo;
string name = student.Name;
string address = student.Address;
fileStream.Close();
//displaying deserialized data
Console.WriteLine("Deserialized data: ");
Console.WriteLine("Roll No = " + rollNo);
Console.WriteLine("Student Name = " + name);
Console.WriteLine("Student Address = " + address);
}
public static void Main(string[] args)
{
SerializingData();
DeserializingData();
Console.ReadLine();
}
}
}

輸出:

C# 中的反序列化

範例 #3

顯示自訂類別的 XML 序列化和反序列化的範例。

代碼:

using System;
using System.IO;
using System.Xml.Serialization;
namespace ConsoleApp4
{
[Serializable]
public class Student
{
public int RollNo { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public Student()
{
RollNo = 0;
Name = "N/A";
Address = "N/A";
}
}
public class Program
{
public static void SerializingData(Student student)
{
//creating file to store data.
FileStream fileStream = new FileStream(@"E:\Content\Student.txt",
FileMode.Create);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Student));
//calling serialize() method to serialize data to file
xmlSerializer.Serialize(fileStream, student);
fileStream.Close();
}
public static void DeserializingData()
{
//opening file to read data
FileStream fileStream = new FileStream(@"E:\Content\Student.txt",
FileMode.Open);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Student))
//calling Deserialize() to deserialize data from the file
Student student = (Student)xmlSerializer.Deserialize(fileStream);
fileStream.Close();
Console.WriteLine("Deserialized data: ");
Console.WriteLine("Student Roll No = " + student.RollNo);
Console.WriteLine("Student Name = " + student.Name);
Console.WriteLine("Student Address = " + student.Address);
}
public static void Main(string[] args)
{
Student student = new Student();
Console.WriteLine("Enter student Roll No");
student.RollNo = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Enter student name");
student.Name = Console.ReadLine();
Console.WriteLine("Enter student address");
student.Address = Console.ReadLine();
SerializingData(student);
DeserializingData();
Console.ReadLine();
}
}
}

輸出:

C# 中的反序列化

結論

反序列化是從先前序列化的位元組序列重建物件的過程。它允許我們在需要時恢復物件。這是序列化的逆過程。 BinaryFormatter 類別的 Deserialize() 方法用於從二進位流進行反序列化。

以上是C# 中的反序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn