Newtonsoft JsonConvert.Deserialization выдает исключение JsonSerializationException: «Ошибка преобразования значения «ИмC#

Место общения программистов C#
Anonymous
Newtonsoft JsonConvert.Deserialization выдает исключение JsonSerializationException: «Ошибка преобразования значения «Им

Сообщение Anonymous »

Недавно я присоединился к новой команде на работе, и у меня возникли проблемы с настройкой репозитория для одного из наших приложений, в частности, я получаю сообщение об ошибке при попытке выполнить операцию, и мы не смогли воспроизвести это. проблема для любого другого члена команды.
Для некоторого дополнительного контекста приложение представляет собой приложение Windows, работающее на архитектуре x64 в качестве плагина для AutoCAD. Мы являемся магазином .NET, поэтому все приложение было написано на C# с использованием .NET framework, хотя управление версиями платформы не единообразно во всем репозитории.
Проблема, с которой я столкнулся, заключается в том, что в приложении есть общая функция CloneJson. По какой-то причине этот метод выдает исключение при попытке десериализации одного из наших пользовательских объектов PortMap. Если вы не заметили это в заголовке, эта десериализация происходит с пакетом Newtonsoft.Json.
Вот полный текст ошибки: JsonSerializationException: 'Ошибка преобразования значения "CompanyName.ApplicationName. Common.Objects.Field.Reader, CompanyName.ApplicationName.Common.Objects, Version=1.0.8976.23506, Culture=neutral, PublicKeyToken=null», чтобы ввести «System.Type».
Inner Исключение:
ArgumentException: не удалось привести или преобразовать System.String в System.Type.
Ошибка выдается при вызове JsonConvert.Deserialize в приведенном ниже методе.< /p>
public static T CloneJson(this T source)
{
if ((object)source == null)
return default(T);
var settings = new Newtonsoft.Json.JsonSerializerSettings()
{
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace,
TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
};
var serializedObj = Newtonsoft.Json.JsonConvert.SerializeObject((object)source, settings);
var deserializedOjb = Newtonsoft.Json.JsonConvert.DeserializeObject(serializedObj, settings);
return deserializedOjb;
}

А это объект PortMap. Я также могу предоставить PanelPortRepExpanded, но, поскольку это код компании, я стараюсь ограничить сумму, которую я делюсь, только тем, что абсолютно необходимо.
public class PortMap
{
public List
Ports { get; set; } = new List();
public PortMap(List ports)
{
Ports = ports;
}
public PortMap()
{

}
}

На этом этапе я попробовал довольно много вещей, включая замену версий пакета, возиться с настройками сериализации. изменение/проверка зависимостей другими способами, но мне это не удалось.
Я также пытался перезагрузить свой ноутбук, потому что у меня было установлено много случайных сред разработки, пакетов и т. д. Я беспокоился, что это может вызвать конфликт, но, похоже, это не имело никакого эффекта.
Некоторые другие важные детали:
  • Поскольку проблема воспроизводится только на компьютере, на котором ранее не был установлен репозиторий, скорее всего, она связана с изменениями, которые команда внесла незадолго до моего присоединения.
  • Один Одно из этих изменений было связано с зависимостями проекта, что привело к отсутствию зависимостей в новых репозиториях, когда я впервые присоединился. с тех пор мы решили эти проблемы, добавив недостающие библиотеки DLL, которые мы использовали для загрузки различных зависимостей, но потенциально это все еще может быть связано с моей проблемой.
Если вам нужна дополнительная информация о проблеме, спрашивайте. На этом этапе я готов попробовать что угодно, поэтому буду очень признателен за любую помощь!
Изменить:
Вот полный вывод ToString() исключения, как того требует dbc:
Newtonsoft.Json.JsonSerializationException: Error converting value "CompanyName.ApplicationName.Common.Objects.Field.Reader, CompanyName.ApplicationName.Common.Objects, Version=1.0.8976.25178, Culture=neutral, PublicKeyToken=null" to type 'System.Type'. Path 'Ports[0].PermittedTypes[0]', line 1, position 174.
---> System.ArgumentException: Could not cast or convert from System.String to System.Type.
at Newtonsoft.Json.Utilities.ConvertUtils.EnsureTypeAssignable(Object value, Type initialType, Type targetType)
at Newtonsoft.Json.Utilities.ConvertUtils.ConvertOrCast(Object initialValue, CultureInfo culture, Type targetType)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)
--- End of inner exception stack trace ---
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyC onverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
at Newtonsoft.Json.Seri alization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContain erContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
at CompanyName.ApplicationName.Common.Objects.Helpers.Extensions.CloneJson[T](T source)

Вот сериализованный Json, запрошенный DavidG. Я взял на себя смелость обрезать данные, поскольку каждая запись в массиве по сути представляла собой идентичные данные:
{
"Ports": [
{
"PermittedTypes": [
"CompanyName.ApplicationName.Common.Objects.Field.Reader, CompanyName.ApplicationName.Common.Objects, Version=1.0.8977.16740, Culture=neutral, PublicKeyToken=null"
],
"PreferredTypes": [
"CompanyName.ApplicationName.Common.Objects.Field.Reader, CompanyName.ApplicationName.Common.Objects, Version=1.0.8977.16740, Culture=neutral, PublicKeyToken=null"
],
"AssociatedReaderSlot": 1,
"ReservedFor": [],
"PortName": "RDR 1",
"DeviceId": "00000000-0000-0000-0000-000000000000"
}
]
}


Подробнее здесь: https://stackoverflow.com/questions/788 ... tion-error

Вернуться в «C#»