【发布时间】:2015-08-27 23:42:14
【问题描述】:
我使用以下代码将 JSON 文件反序列化为 .NET 对象:
using (var textReader = File.OpenText(filePath))
{
var settings = new JsonSerializerSettings
{
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple,
TypeNameHandling = TypeNameHandling.All
};
var deserializer = JsonSerializer.CreateDefault(settings);
deserializer.Converters.Add(new StringEnumConverter());
return deserializer.Deserialize<T>(new JsonTextReader(textReader));
}
例如,在单元测试的上下文中使用该功能时,这一切都很好。所有类都放在几个程序集中。
现在我不想使用单元测试,而是想通过 PowerShell cmdlet 控制我的组件流。
我写了一个 cmdlet 并导入仍然放在 bin\Debug 文件夹中的模块:Import-Module .\MigrationShell.dll
此程序集引用所有其他已序列化/反序列化的程序集和类。
在 PowerShell 上下文中使用 JSON 函数时,出现以下异常:
JSON 中指定的错误解析类型 'System.Collections.Generic.List`1[[Migration.Data.MediaGalleryItem, 迁移]],mscorlib'。路径'$values[0].MediaGalleryItems.$type', 第 7 行,位置 133。
因此,当我在 PowerShell 上下文中调用我的代码时,JSON.NET 似乎无法解析 Migration.dll 中定义的类型。
我该如何解决这个问题?
更新: 我刚刚检查了解析我的自定义对象类型没有问题。问题似乎是通用列表。但仍然只有在 PowerShell cmdlet 上下文中调用功能时才会出现错误。
【问题讨论】:
-
这可能是 .net 框架版本问题吗?针对 NET 4 的程序集,powershell 仍在运行 2.0/3.5?您可以使用环境变量 $PSVersionTable 在 powershell 中获取 CLR 版本
-
PowerShell 与 .NET 4 (4.0.30319.34209) 一起运行。我的程序集的目标是 4.5。这可能是问题吗?
-
不,NET 4.5 仍然是 .NET 4 而您的 CLR 版本是 NET 4.5.2,所以这应该不是问题。您可以在 powershell 中使用 New-Object 手动创建 Migration.Data.MediaGalleryItem 类型的对象吗?只是为了确保 ps 实际上在抱怨该类型而不是通用列表类型。
-
啊,是的,你是对的。目前无法通过 PowerShell 创建该类型的对象。
-
那么您可以尝试创建一些已知简单类型(如字符串)的通用列表,以确保可以解决该问题。我没有使用 powershell 模块的经验,您的组件实际上是一个模块吗?或者它只是一个图书馆?在这种情况下,我总是在 ps 脚本中加载这样的内容:[System.Reflection.Assembly]::LoadFile($libPath)
标签: c# .net powershell json.net