2015-08-27 3 views
3

Я использую следующий код для десериализации JSON файлы объектов .NET:JSON.NET ошибка разрешения типа в PowerShell командлет

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.

Я написал командлет и импортировать модуль, который по-прежнему помещается в папку \ Debug бен:. Import-Module \ MigrationShell.dll

Эта сборка ссылки все другие сборки и классы, которые сериализованная/десериализации.

Когда функции JSON используются в контексте PowerShell я получаю следующее исключение:

ошибка разрешения типа, указанного в JSON «System.Collections.Generic.List`1 [[Migration.Data.MediaGalleryItem , Миграция]], mscorlib '. Путь «$ значения [0] .MediaGalleryItems. $ Типа», линия 7, позиция 133.

Таким образом, кажется, что JSON.NET не в состоянии решить тот тип, который определен в Migration.dll когда это мой код вызывается в контексте PowerShell.

Как я могу решить эту проблему?

Обновление: Я только что проверил, что нет никаких проблем при разрешении моих пользовательских типов объектов. Проблема, похоже, является общим списком. Но все же ошибка возникает только при вызове функции в контексте командлета PowerShell.

+0

это может быть проблема с версией каркаса .net? Сборка, ориентированная на NET 4, powershell все еще работает с 2.0/3.5? Вы можете получить версию CLR в powershell, используя переменную среды $ PSVersionTable –

+0

PowerShell работает с .NET 4 (4.0.30319.34209). Мои сборки ориентированы на 4.5. Может быть, это проблема? –

+0

нет, NET 4.5 все еще .NET 4, а ваша версия CLR - версия NET 4.5.2, поэтому это не должно быть проблемой. Можете ли вы вручную создать объект типа Migration.Data.MediaGalleryItem с помощью New-Object в powershell? Просто чтобы убедиться, что ps действительно жалуется на этот тип, а не на общий тип списка. –

ответ

4

Я нашел решение для своей проблемы. Проблема заключается в том, как JSON.NET разрешает имена типов. Я думаю, что это не ошибка JSON.NET, потому что кажется, что домен PowerShell обрабатывает тип, разрешающий другим способом.

Дело в том, что мне нужно было предоставить полное имя типа вместо короткого для сериализации и десериализации.

Так что я изменил настройки Serializer к этому:

var settings = new JsonSerializerSettings 
{ 
    TypeNameAssemblyFormat = FormatterAssemblyStyle.Full, 
    TypeNameHandling = TypeNameHandling.All 
}; 

Так JSON изменилось от этого типа декларации

"$ типа": «System.Collections.Generic.List`1 [ [Migration.Data.MediaGalleryItem, миграция]], mscorlib»

к этому один

«$ type»: «System.Collections.Generic.List`1 [[Migration.Data.MediaGalleryItem, Migration, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]], mscorlib, Version = 4.0 .0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 "

Все работает отлично.Спасибо Dirk за его комментарии :)

Смежные вопросы