寻求C#中BinaryFormatter的安全替代序列化方案
BinaryFormatter安全替代方案(适配string[]、byte[]及自定义类场景)
你当前使用BinaryFormatter处理string[]、byte[]和自定义Item类的序列化/反序列化,即便通过SerializationBinder限制了可反序列化类型,仍存在DoS等安全风险。以下是几个官方推荐或业界常用的安全替代方案,直接适配你的原有场景:
方案1:System.Text.Json(微软官方推荐,轻量无依赖)
.NET Core 3.0+/.NET 5+内置,默认反序列化只处理指定类型,不存在BinaryFormatter的安全隐患。自定义类无需标记[Serializable],代码实现如下:
using System.Text.Json; class Program { static void Main(string[] args) { string[] cars = { "Volvo", "BMW", "Ford", "Mazda" }; var item = new Item { Name = "Orange" }; byte[] bytes = SerializeData(item); var deserializedData = DeserializeData<Item>(bytes); // 测试string[]序列化反序列化 byte[] carBytes = SerializeData(cars); var deserializedCars = DeserializeData<string[]>(carBytes); } private static byte[] SerializeData<T>(T obj) { return JsonSerializer.SerializeToUtf8Bytes(obj); } private static T DeserializeData<T>(byte[] bytes) { return JsonSerializer.Deserialize<T>(bytes); } } // 自定义类无需[Serializable]标记 public class Item { public string Name { get; set; } }
方案2:DataContractSerializer(官方序列化组件,支持复杂类型)
属于.NET基础库,适合兼容旧有WCF场景或处理更复杂类型的情况,需给自定义类添加[DataContract]和[DataMember]标记:
using System.IO; using System.Runtime.Serialization; class Program { static void Main(string[] args) { string[] cars = { "Volvo", "BMW", "Ford", "Mazda" }; var item = new Item { Name = "Orange" }; byte[] bytes = SerializeData(item); var deserializedData = DeserializeData<Item>(bytes); } private static byte[] SerializeData<T>(T obj) { var serializer = new DataContractSerializer(typeof(T)); using var ms = new MemoryStream(); serializer.WriteObject(ms, obj); return ms.ToArray(); } private static T DeserializeData<T>(byte[] bytes) { var serializer = new DataContractSerializer(typeof(T)); using var ms = new MemoryStream(bytes); return (T)serializer.ReadObject(ms); } } [DataContract] public class Item { [DataMember] public string Name { get; set; } }
方案3:MessagePack(高性能二进制序列化,安全可控)
如果需要二进制序列化的性能优势,MessagePack是安全的选择,需先安装NuGet包MessagePack:
using MessagePack; class Program { static void Main(string[] args) { string[] cars = { "Volvo", "BMW", "Ford", "Mazda" }; var item = new Item { Name = "Orange" }; byte[] bytes = SerializeData(item); var deserializedData = DeserializeData<Item>(bytes); } private static byte[] SerializeData<T>(T obj) { return MessagePackSerializer.Serialize(obj); } private static T DeserializeData<T>(byte[] bytes) { return MessagePackSerializer.Deserialize<T>(bytes); } } // 可标记[MessagePackObject]让序列化更高效,也可省略(默认按属性名序列化) [MessagePackObject] public class Item { [Key(0)] public string Name { get; set; } }
内容的提问来源于stack exchange,提问作者Loch
相关产品推荐
相关产品推荐

