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

.NET Framework类库迁移至.NET:本地化资源序列化遇阻求助

解决.NET中ResourceWriter不支持二进制序列化资源的问题

方案1:切换到ResX格式处理资源

.NET对ResX格式的支持更全面,几乎所有可序列化类型都能存储,完全适配你的本地化流程:

  • 提取资源后,用ResXResourceWriter替代ResourceWriter,直接将资源写入.resx文件
  • 本地化完成后,用.NET SDK自带的resgen工具将.resx编译为.resources文件
  • 最后通过al工具(Assembly Linker)生成卫星程序集

示例代码:

// 写入ResX文件
using (var writer = new ResXResourceWriter("LocalizedResources.resx"))
{
    foreach (var entry in localizedResources)
    {
        // 直接添加任意支持的类型,无TypeCode限制
        writer.AddResource(entry.Key, entry.Value);
    }
}

执行命令行编译:

# 将ResX转为.resources
resgen LocalizedResources.resx LocalizedResources.resources
# 生成zh-CN文化的卫星程序集
al /t:lib /embed:LocalizedResources.resources /culture:zh-CN /out:MyAssembly.resources.dll

方案2:对复杂类型手动序列化存储

如果必须保留二进制.resources格式,可将不在允许列表的类型转为字节数组或Base64字符串存储,读取时再反序列化:

  • 写入时:把窗体、自定义对象等复杂类型序列化为字节数组,作为byte[]添加到ResourceWriter
  • 读取时:取出字节数组反序列化为原类型

示例代码:

// 写入时序列化复杂类型
using (var writer = new ResourceWriter("Resources.resources"))
{
    foreach (var entry in localizedResources)
    {
        var type = entry.Value.GetType();
        if (IsBasicType(type)) // 自行判断是否为string/int等基础类型
        {
            writer.AddResource(entry.Key, entry.Value);
        }
        else
        {
            // 推荐用System.Text.Json替代过时的BinaryFormatter
            var json = JsonSerializer.Serialize(entry.Value);
            writer.AddResource(entry.Key, json);
        }
    }
    writer.Generate();
}

// 读取时反序列化
using (var reader = new ResourceReader("Resources.resources"))
{
    foreach (DictionaryEntry entry in reader)
    {
        if (entry.Value is string json && IsComplexType(entry.Key)) // 自行标记复杂类型资源
        {
            var originalValue = JsonSerializer.Deserialize(json, targetType);
            // 使用反序列化后的对象
        }
        else
        {
            // 直接使用基础类型值
        }
    }
}

方案3:使用增强型资源写入器

安装System.Resources.Extensions NuGet包,用其中的ResourceWriter2替代原生ResourceWriter——它扩展了支持的类型列表,兼容原有二进制资源格式,无需大幅修改代码:

示例代码:

using System.Resources.Extensions;

using (var writer = new ResourceWriter2("Resources.resources"))
{
    foreach (var entry in localizedResources)
    {
        writer.AddResource(entry.Key, entry.Value);
    }
    writer.Generate();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:50:26