You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:53:07