C# 中实现泛型对象与字节数组互转
本文展示了在 C# 中利用 BinaryFormatter 将任意泛型对象序列化为字节数组,以及从字节数组反序列化为对象的具体实现方法。通过引入 System.IO 和 System.Runtime.Serialization.Formatters.Binary 命名空间,结合 MemoryStream 可在内存中高效完成数据转换。
准备环境
在进行对象序列化操作前,需要确保项目中已引用以下核心命名空间,它们分别用于流处理和二进制格式化:
System.IO:提供对数据流和文件系统进行支持的基本类。System.Runtime.Serialization.Formatters.Binary:包含用于二进制序列化的类。
同时,参与序列化的目标类必须标记为 [Serializable],且所有属性也必须是可序列化的类型。
第1步:实现泛型序列化方法
此步骤旨在将传入的任意类型对象(T)转换为 byte[] 字节数组,以便进行后续存储或网络传输。
操作入口:自定义类的公共方法区。
具体动作:
- 创建
MemoryStream实例作为内存中的写入缓冲区。 - 实例化
BinaryFormatter对象以处理格式控制。 - 调用
bFormatter.Serialize方法,将对象t写入流中。 - 返回内存流的字节缓冲区。
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
// 假设该方法位于某个类内部
protected byte[] Serialize<T>(T t)
{
MemoryStream mStream = new MemoryStream();
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(mStream, t);
return mStream.GetBuffer();
}
第2步:实现泛型反序列化方法
此步骤接收之前生成的字节数组,并将其还原为原始的泛型对象 T。
操作入口:自定义类的公共方法区。
具体动作:
- 根据输入的字节数组
b创建一个新的MemoryStream。 - 实例化
BinaryFormatter对象。 - 调用
Deserialize方法读取流数据,并将结果强制转换为类型T。
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
protected T Deserialize<T>(byte[] b)
{
BinaryFormatter bFormatter = new BinaryFormatter();
return (T)bFormatter.Deserialize(new MemoryStream(b));
}
注意事项与排错
在使用上述方法时,需注意以下关键点以确保操作的稳定性:
- 类标记要求:所有要被序列化的实体类都必须添加
[Serializable]特性,否则在序列化时会抛出异常。 - 版本兼容性:
BinaryFormatter在某些新版本的 .NET 环境中可能存在安全限制或已过时的警告。若遇到兼容性错误,建议考虑使用System.Text.Json或Newtonsoft.Json等现代序列化库,或者升级/降级对应的 .NET Framework/Core 版本至兼容状态。 - 空指针处理:反序列化时若传入空数组
null或长度不足的数组,程序可能崩溃。建议在实际应用中加入非空判断。
简要总结
以上就是 C# 泛型序列化对象为字节数组的详细内容,更多关于 C# 序列化与反序列化技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









