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

DiffSharp中Model.save()与Model.saveState()无法使用,求解决方案

解决DiffSharp中Model.save()/saveState()的BinaryFormatter禁用问题

问题原因

错误提示明确显示BinaryFormatter序列化/反序列化在当前应用中被禁用,而旧版本DiffSharp默认依赖这个已被微软标记为不安全的组件实现模型状态保存。

解决方案

  • 升级DiffSharp到最新版本
    新版本DiffSharp已替换BinaryFormatter为更安全的序列化方案(如MessagePack)。在F#脚本中可直接更新包引用:

    #r "nuget: DiffSharp, *"
    

    项目中修改包引用至最新稳定版即可。

  • 临时启用BinaryFormatter(不推荐)
    若暂时无法升级,可通过配置启用BinaryFormatter。针对.NET 5+项目,修改app.config或web.config添加以下内容:

    <configuration>
      <runtime>
        <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.UseSafeSerializationHelpers=false" />
      </runtime>
    </configuration>
    > 注意:`BinaryFormatter`存在严重安全风险,微软已将其标记为过时,仅建议用于临时兼容场景。
    
    
  • 手动实现模型参数序列化
    自行提取模型参数并使用安全序列化库(如MessagePack、Newtonsoft.Json)完成保存/加载,示例代码如下:

    open DiffSharp
    open MessagePack
    
    // 保存模型参数
    let saveModelParams (model: Model) (path: string) =
        let paramValues = model.parameters() |> Seq.map (fun p -> p.value) |> Seq.toArray
        use stream = System.IO.File.OpenWrite(path)
        MessagePackSerializer.Serialize(stream, paramValues)
    
    // 加载模型参数
    let loadModelParams (model: Model) (path: string) =
        use stream = System.IO.File.OpenRead(path)
        let paramValues = MessagePackSerializer.Deserialize<float[] array>(stream)
        model.parameters() 
        |> Seq.zip paramValues 
        |> Seq.iter (fun (valArr, param) -> param.value <- valArr)
    

    使用前需安装对应序列化包,如MessagePack:#r "nuget: MessagePack"

内容的提问来源于stack exchange,提问作者Loco Barocco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:50:04