基于a TypeConverter article for making custom resource objects,以下代码正常运行:
string file = @".\SomeResources.resx";
using (ResXResourceWriter resx = new ResXResourceWriter(file))
{
resx.AddResource("test", "me");
resx.AddResource("when", DateTime.Now);
resx.AddResource("custom", new LogPair { Key = "check", Value = "clear" });
}
using (ResXResourceSet resxSet = new ResXResourceSet(file))
{
var check = (LogPair)resxSet.GetObject("custom", true);
}
最值得注意的是,我成功检索了自定义LogPair
对象实例。
然后我使用resgen将resx编译成资源文件,然后执行以下代码:
var stuff = ResourceManager.CreateFileBasedResourceManager("SomeResources", ".", null);
string res = stuff.GetString("test");
var info = (LogPair)stuff.GetObject("custom");
var now = (DateTime)stuff.GetObject("when");
正确获取字符串res
,给出“me”的值。 DateTime
也可以正确获取。但是,info
变量设置为null。然后我使用Visual Studio来查看resgen生成的资源文件。它显示我的自定义对象已转换为null类型(十六进制值为零)。
所以问题似乎出现在resgen本身。我还了解到该问题与我的自定义TypeConverter有关。我的自定义TypeConverter用于(取消)将LogPair
序列化为JSON。请注意下面的resx文件:
<data name="test" xml:space="preserve">
<value>me</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="when" type="System.DateTime, mscorlib">
<value>07/30/2014 13:23:59</value>
</data>
<assembly alias="Serve.Shared.Apis.Injection.Test" name="Serve.Shared.Apis.Injection.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<data name="custom" type="Injection.Test.LogPair, Serve.Shared.Apis.Injection.Test">
<value>{"Key":"check","Value":"clear"}</value>
</data>
再一次,我可以巧妙地阅读上面的resx。当我使用resgen将其编译为资源文件时,只有一个问题。我用了这个命令:
Resgen /r:Serve.MyAssemblyName.dll SomeResources.resx
resgen没有报告任何错误。
如果我放弃我的自定义TypeConverter,并允许resgen使用标准二进制序列化(以及CDATA seciton等等),那么一切正常。
简而言之,resgen不喜欢我的自定义TypeConverter - 即使资源文件设计用于自定义TypeConverters。
我该如何解决这个问题?