23

У меня есть следующий объект:Почему Json.NET требует System.Xml.Linq v5.0.5 для сериализации простого объекта?

public class ProjectInfo 
{ 
    public string ConnectionStringName { get; set; } 
    public string DefaultEntityNamespace { get; set; } 
    public string DefaultSharedNamespace { get; set; } 
    public string DefaultTestNamespace { get; set; } 
    public string SqlProviderName { get; set; } 
} 

Что я пытаюсь сделать простой сериализации (в VSIX проекта):

var settings = new ProjectInfo { ConnectionStringName = "SomeName" }; 
var json = JsonConvert.SerializeObject(settings); 

, который дает мне:

An exception of type 'System.IO.FileNotFoundException' occurred in Newtonsoft.Json.dll but was not handled in user code 

Additional information: Could not load file or assembly 'System.Xml.Linq, Version=5.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. 

I «В последний час мы пытались выяснить, откуда происходит зависимость или почему Json.NET пытается использовать это пространство имен. System.Xml.Linq не ссылается ни на один из моих проектов.

Из трассировки стека можно увидеть:

at Newtonsoft.Json.Converters.XmlNodeConverter.CanConvert(Type valueType) 
    at Newtonsoft.Json.JsonSerializer.GetMatchingConverter(IList`1 converters, Type objectType) 
    at Newtonsoft.Json.Serialization.DefaultContractResolver.InitializeContract(JsonContract contract) 
    at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType) 
    at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType) 
    at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) 
    at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) 
    at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer) 
    at Newtonsoft.Json.JsonConvert.SerializeObject(Object value) 

..но почему это принять этот маршрут?

Update

Простой тест также не:

[Fact] 
public void should_be_Able_to_Serialize_settings() 
{ 
    JsonConvert.SerializeObject(new ProjectInfo {ConnectionStringName = "Arne"}); 
} 

Update 2

Этот проект работал раньше. Он также работает на компьютере коллеги. Единственное различие, которое я вижу, это то, что я обновился до VStudio 2015 Обновление 1. (или что я сделал глупую ошибку где-то). Но я также сделал жесткий сброс до последней версии, которую использует мой коллега.

Почему он пытается ссылаться на v5.0.5 of System.Linq.Xml? Не является ли v4.0.0 стандартным для .NET 4.5? К какой версии .NET относится v5.0.5?

(я никогда не имел подобную проблему с Json.NET раньше. Это что-то с VStudio 2015/.NET 4.5.2/VSIX проект?)

Update3

Здесь являются зависимостями. Они показывают, что Json.NET пытается ссылаться, что точной версии:

enter image description here

Update:

Json.NET ссылка в файле проекта:

<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=c70b2336aed9f731, processorArchitecture=MSIL"> 
    <HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> 
    <Private>True</Private> 
</Reference> 

Редактировать 4:

Моя проблема заключается в том, что расширение не работает, поскольку оно пытается загрузить сборку, которая не существует. По моему мнению, v5.0.5 является сборкой silverlight. И я не использую Silverlight.

Я попытался добавить перенаправление сборки, но он не работает.

<dependentAssembly> 
    <assemblyIdentity name="System.Xml.Linq" publicKeyToken="31bf3856ad364e35" culture="neutral"/> 
    <bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="4.0.0.0"/> 
</dependentAssembly> 
+0

Вы можете показать короткую, но полную программу, которая демонстрирует проблему? Что находится в 'настройках'? –

+0

newtonsoft.json v7.0.1 через nuget – jgauffin

+0

Я получил обновление VStudio 2015 1 – jgauffin

ответ

2

Json.NET использует System.Xml.Linq для преобразования json в xml.

Вы сможете скомпилировать без зависимостей библиотеки, если вы не ссылаетесь ни на один из типов зависимостей. Это нормально. У меня была такая же проблема с зависимостью Iesi.Collections от NHibernate.

Я смотрел исходный код Json.Net, а операторы using для System.Xml.Linq были условно определены для .Net-версии. Вы и ваш коллега используете ту же версию .Net? Вы недавно изменили .Net на своей машине?

Что я предлагаю, это полностью удалить NHibernate и любые зависимости. Затем установите Json.Net с помощью NuGet. NuGet автоматически добавит все зависимости и выполнит любые необходимые переадресации связывания сборок.

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