信息发布→ 登录 注册 退出

.NET怎么序列化和反序列化一个二进制对象

发布时间:2025-11-06

点击量:
BinaryFormatter 虽可序列化二进制对象,但已过时且不安全;2. 推荐使用 protobuf-net 实现高效、跨平台序列化;3. 类需标记 [Serializable] 或 [ProtoContract],字段按序标注以确保兼容性。

在 .NET 中,要序列化和反序列化一个二进制对象,可以使用 BinaryFormatter 类。虽然它在较新版本的 .NET(如 .NET 5+)中已被标记为过时并默认禁用,但在某些旧项目或特定场景下仍可使用。推荐方式是使用更安全、性能更好的替代方案,比如 System.Text.Json 或第三方库如 protobuf-net。下面先介绍 BinaryFormatter 的基本用法,再给出现代推荐做法。

使用 BinaryFormatter 进行二进制序列化与反序列化

注意:BinaryFormatter 存在安全风险,不建议用于不可信数据,且在 .NET Core/.NET 5+ 中默认禁用。

要使用 BinaryFormatter,目标类必须加上 [Serializable] 特性。

示例代码:

[Serializable]
public class Person
{
   public string Name { get; set; }
   public int Age { get; set; }
}

序列化到二进制文件:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

var person = new Person { Name = "张三", Age = 30 };
using (var fs = new FileStream("person.bin", FileMode.Create))
{
   var formatter = new BinaryFormatter();
   formatter.Serialize(fs, person);
}

从二进制文件反序列化:

using (var fs = new FileStream("person.bin", FileMode.Open))
{
   var formatter = new BinaryFormatter();
   var person = (Person)formatter.Deserialize(fs);
   Console.WriteLine($"{person.Name}, {person.Age}");
}

推荐方式:使用 protobuf-net(高效且跨平台)

更现代、安全且高效的二进制序列化方式是使用 protobuf-net 库,它基于 Google Protocol Buffers,支持 .NET Framework 和 .NET Core/5+。

安装 NuGet 包: Install-Package protobuf-net

使用示例: using ProtoBuf;

[ProtoContract]
public class Person
{
   [ProtoMember(1)]
   public string Name { get; set; }

   [ProtoMember(2)]
   public int Age { get; set; }
}

序列化:

using (var file = File.Create("person.pb"))
{
   Serializer.Serialize(file, person);
}

反序列化:

using (var file = File.OpenRead("person.pb"))
{
   var person = Serializer.Deserialize(file);
   Console.WriteLine($"{person.Name}, {person.Age}");
}

小结

- BinaryFormatter 简单但不安全,已过时,仅适用于旧项目。 - 推荐使用 protobuf-net 实现高性能、跨平台的二进制序列化。 - 标记字段顺序(如 ProtoMember(1))有助于兼容性。 - 所有需要序列化的类型都应正确标注特性。

基本上就这些。根据项目环境选择合适的方式即可。

标签:# var  # 但不  # 高性能  # 第三方  # 它在  # 可以使用  # 适用于  # 但在  # 已被  # 推荐使用  # 序列化  # 对象  # console  # js  # FileStream  # public  # class  # using  # int  # String  # .net  # google  # stream  # go  # json  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!