23 votos

¿Por qué requiere Json.NET v5.0.5 System.Xml.Linq para la serialización de un objeto simple?

Tengo el siguiente objeto:

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

Lo que trato de hacer una simple serialización de (en un proyecto de VSIX):

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

lo que me da:

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.

He pasado la última hora tratando de averiguar donde la dependencia viene o por qué Json.NET intenta utilizar ese espacio de nombres. Sistema.Xml.Linq es no se hace referencia en alguno de mis proyectos.

A partir de la traza de la pila puedo ver:

   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)

..pero ¿por qué tomar ese camino?

Actualización

Una prueba simple caso también se produce un error:

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

Actualización 2

Este proyecto ha trabajado antes. También funciona en un compañero de equipo. La única diferencia que veo es que he actualizado a VStudio 2015 Update 1. (o que me he hecho un tonto error en alguna parte). Pero también he hecho un hard reset a la última revisión que mi colega usos.

¿Por qué se intenta hacer referencia a v5.0.5 de System.Linq.Xml? No es la v4.0.0 el estándar de uno .NET 4.5? Qué versión de .NET hace v5.0.5 pertenecen?

(Nunca he tenido un problema similar con Json.NET antes de. Es algo con VStudio 2015 / .NET 4.5.2 / VSIX proyecto?)

Update3

Aquí están las dependencias. Ellos muestran que Json.NET intenta hacer referencia a que versión exacta:

enter image description here

Actualización:

Json.NET referencia en el archivo de proyecto:

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

Edit 4:

Mi problema es que la extensión no funciona como se intenta cargar un ensamblado que no existe. Desde mi entender, v5.0.5 es un silverlight asamblea. Y yo no uso de silverlight.

He intentado añadir un ensamblado de redirección, pero no parece funcionar.

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

2voto

Json.NET los usos del Sistema.Xml.Linq para la conversión de json y xml.

Usted va a ser capaz de compilar sin una biblioteca dependencias, siempre y cuando no hacer referencia a cualquiera de los tipos en las dependencias. Esto es normal. He tenido el mismo problema con NHibernate Iesi.Las colecciones de la dependencia.

Me miré en el Json.Net el código fuente y las instrucciones de uso para el Sistema.Xml.Linq son conditionalized para el .Net versión. Están usted y su colega de la ejecución de la misma .Net versión? Hizo recientemente cambio .Net en su máquina?

Lo que yo sugeriría es eliminar completamente NHibernate y dependencias. Luego de instalar Json.Net con NuGet. NuGet, se agrega automáticamente todas las dependencias y realizar cualquier asamblea de la unión de las redirecciones.

Incluso si usted no desea utilizar NuGet, ejecutar un diff y ver qué cambios se hace para que pueda hacer lo mismo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: