资源文件中的自定义对象

时间:2014-07-30 15:00:42

标签: c# asp.net asp.net-mvc wpf winforms

基于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。

我该如何解决这个问题?

0 个答案:

没有答案