首页 >后端开发 >C#.Net教程 >C# 中的反序列化

C# 中的反序列化

王林
王林原创
2024-09-03 15:25:14528浏览

以下文章提供了 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
上一篇:Access Modifiers in C#下一篇:C# Thread