23

Mam następujący obiekt:Dlaczego Json.NET wymaga System.Xml.Linq v5.0.5 do serializacji prostego obiektu?

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; } 
} 

Który próbuję zrobić prosty szeregowanie (w VSIX projektu):

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

który daje mi:

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 Spędziliśmy ostatnią godzinę, próbując dowiedzieć się, skąd pochodzi ta zależność lub dlaczego Json.NET próbuje użyć tej przestrzeni nazw. System.Xml.Linq nie jest wymieniony w żadnym z moich projektów.

Od ślad stosu widzę:

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) 

..ale dlaczego trwa tej trasie?

Aktualizacja

prosta sprawa test nie powiedzie się również:

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

Aktualizacja 2

Projekt ten pracował wcześniej. Działa również na komputerze kolegi. Jedyną różnicą, jaką widzę, jest uaktualnienie do wersji VStudio 2015 Update 1. (lub że popełniłem głupią pomyłkę gdzieś). Ale również wykonałem twardy reset do najnowszej wersji, z której korzysta mój kolega.

Dlaczego próbuje odwoływać się do wersji 5.0.5 pliku System.Linq.Xml? Czy v4.0.0 nie jest standardem dla .NET 4.5? Do której wersji .NET należy v5.0.5?

(nigdy nie miałem podobny problem z Json.NET wcześniej. Czy to coś z VStudio 2015/.NET 4.5.2/VSIX projekt?)

Update3

Tutaj są zależnościami. Pokazują one, że Json.NET próbuje odwoływać że dokładnej wersji:

enter image description here

Aktualizacja:

Json.NET odniesienia w pliku projektu:

<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> 

Edycja 4:

Mój problem polega na tym, że rozszerzenie nie działa, ponieważ próbuje załadować złożenie, które nie istnieje. Z mojego rozumienia, v5.0.5 jest zgromadzeniem silverlight. I nie używam silverlight.

Próbowałem dodać przekierowanie zespołu, ale nie wydaje się działać.

<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

Czy możesz pokazać krótki, ale kompletny program, który pokazuje problem? Co zawiera "ustawienia"? –

+0

newtonsoft.json v7.0.1 via nuget – jgauffin

+0

Mam aktualizację VStudio 2015 1 – jgauffin

Odpowiedz

2

Json.NET używa System.Xml.Linq do konwersji json na xml.

Będziesz mógł kompilować bez zależności biblioteki, o ile nie odwołasz się do żadnego z typów zależności. To normalne. Miałem ten sam problem z zależnością Iesi.Collections od NHibernate.

Zajrzałem do kodu źródłowego Json.Net, a instrukcje użycia dla System.Xml.Linq są warunkowane dla wersji .Net. Czy ty i twój kolega korzystacie z tej samej wersji .Net? Czy ostatnio zmieniłeś .Net na swoim komputerze?

Proponuję całkowicie usunąć NHibernate i wszelkie zależności. Następnie zainstaluj Json.Net z NuGet. NuGet automatycznie doda wszystkie zależności i wykona wszelkie potrzebne przekierowania powiązania zestawów.

Nawet jeśli nie chcesz używać NuGet, uruchom diff i zobacz, jakie zmiany on robi, abyś mógł zrobić to samo.