C#将二进制序列化文件怎样反序列化?
时间: 2024-09-15 16:00:25 浏览: 43
在C#中,反序列化已经序列化的二进制文件的过程相对简单。你可以使用相同的`BinaryFormatter`类来完成这个任务。以下是基本步骤:
1. 首先,打开或创建一个表示存储序列化数据的文件。假设我们已经有一个文件路径`filePath`:
```csharp
FileStream fileStream = File.OpenRead(filePath);
```
2. 创建一个新的`MemoryStream`来存储从文件读取的数据:
```csharp
MemoryStream memoryStream = new MemoryStream();
fileStream.CopyTo(memoryStream);
fileStream.Close();
```
3. 初始化`BinaryFormatter`实例,并使用其`Deserialize`方法来反序列化数据:
```csharp
BinaryFormatter formatter = new BinaryFormatter();
object deserializedObject;
memoryStream.Seek(0, SeekOrigin.Begin);
deserializedObject = formatter.Deserialize(memoryStream);
```
现在,`deserializedObject`变量包含了原始序列化对象的内容。
相关问题
C#的二进制序列化文件
在C#中,二进制序列化是一种将对象转换成字节流的过程,以便可以存储到文件中或通过网络传输。这种操作允许你在需要的时候恢复对象的状态,而无需知道其具体的实现细节。C#提供了一个名为`System.Runtime.Serialization`的命名空间,其中包含`BinaryFormatter`类用于进行二进制序列化。
以下是创建和读取二进制序列化文件的基本步骤:
1. **序列化(保存对象)**:
- 创建一个对象。
- 创建一个`BinaryFormatter`实例。
- 使用`Serialize`方法将对象转换为字节数组并写入文件。
```csharp
object obj = new MyClass();
using (FileStream stream = File.Create("data.bin"))
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
}
```
2. **反序列化(从文件加载对象)**:
- 打开文件。
- 使用`Deserialize`方法从字节数组中重构对象。
```csharp
using (FileStream stream = File.OpenRead("data.bin"))
{
BinaryFormatter formatter = new BinaryFormatter();
object deserializedObj = formatter.Deserialize(stream);
}
```
C# 二进制序列化
在 C# 中,可以使用 BinaryFormatter 类来进行二进制序列化和反序列化操作。下面是一个简单的示例:
```csharp
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Program
{
static void Main(string[] args)
{
// 创建一个 Person 对象
Person person = new Person { Name = "Tom", Age = 18 };
// 创建一个 BinaryFormatter 对象
BinaryFormatter formatter = new BinaryFormatter();
// 将 Person 对象序列化为二进制流
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, person);
// 将二进制流反序列化为 Person 对象
stream.Seek(0, SeekOrigin.Begin);
Person newPerson = (Person)formatter.Deserialize(stream);
// 输出序列化后的 Person 对象的属性值
Console.WriteLine($"Name:{newPerson.Name}, Age:{newPerson.Age}");
}
}
```
在上面的示例中,我们首先创建了一个 Person 类,并将其标记为可序列化(即添加了 `[Serializable]` 属性)。然后,我们在 `Main` 方法中创建了一个 Person 对象,并使用 BinaryFormatter 对象将其序列化为一个 MemoryStream 对象。接着,我们将 MemoryStream 对象的读取位置设置为开头,并使用 BinaryFormatter 对象将其反序列化为一个新的 Person 对象。最后,我们输出新的 Person 对象的属性值。
需要注意的是,BinaryFormatter 类在进行序列化和反序列化时,会将对象的完整类型信息也序列化到二进制流中。因此,在进行反序列化时,需要确保反序列化的对象类型与序列化时的对象类型完全一致,否则会抛出异常。
阅读全文