.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
相关产品推荐
相关产品推荐

