推荐答案
在C#中,可以通过实现 ISerializable 接口来自定义序列化过程。以下是一个示例代码:
// www.javascriptcn.com code example
using System;
using System.Runtime.Serialization;
[Serializable]
public class CustomSerialization : ISerializable
{
public string Name { get; set; }
public int Age { get; set; }
// 默认构造函数
public CustomSerialization() { }
// 反序列化构造函数
protected CustomSerialization(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
Age = info.GetInt32("Age");
}
// 实现 ISerializable 接口的 GetObjectData 方法
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Age", Age);
}
}本题详细解读
1. ISerializable 接口
ISerializable 接口允许你完全控制对象的序列化和反序列化过程。通过实现这个接口,你可以自定义哪些数据被序列化以及如何序列化。
2. GetObjectData 方法
GetObjectData 方法是 ISerializable 接口的核心方法之一。它用于在序列化过程中将对象的数据添加到 SerializationInfo 对象中。你可以在这个方法中决定哪些字段或属性需要被序列化。
3. 反序列化构造函数
反序列化构造函数是一个特殊的构造函数,用于在反序列化过程中重建对象。它接受 SerializationInfo 和 StreamingContext 两个参数。SerializationInfo 包含了序列化时存储的数据,你可以从中提取数据并赋值给对象的字段或属性。
4. Serializable 特性
[Serializable] 特性用于标记一个类可以被序列化。如果一个类没有这个特性,尝试序列化时会抛出 SerializationException 异常。
5. 使用示例
以下是如何使用自定义序列化类的示例:
// www.javascriptcn.com code example
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
class Program
{
static void Main()
{
CustomSerialization obj = new CustomSerialization { Name = "John", Age = 30 };
// 序列化
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream("data.dat", FileMode.Create))
{
formatter.Serialize(stream, obj);
}
// 反序列化
using (FileStream stream = new FileStream("data.dat", FileMode.Open))
{
CustomSerialization newObj = (CustomSerialization)formatter.Deserialize(stream);
Console.WriteLine($"Name: {newObj.Name}, Age: {newObj.Age}");
}
}
}在这个示例中,CustomSerialization 类的对象被序列化到文件中,然后再从文件中反序列化回来。