2010-06-22 8 views
4

Je viens de mettre à jour ma version de NewtonSoft JSON.NET de la version 3.0.0 vers la version 3.5.0 et j'ai remarqué que les membres protégés ne sont pas implicitement sérialisés.Mise à niveau de NewtonSoft JSON.NET sans sérialisation implicite des membres protégés

J'ai la classe suivante:

public class SimpleFileContainer : IDto 
{ 
    public virtual string Name { get; protected set; } 

    public virtual string Path { get; protected set; } 

    public SimpleFileContainer(string name, string path) 
    { 
     Name = name; 
     Path = path; 
    } 
} 

Le code de test suivant ne passe pas

var json = JsonConvert.SerializeObject(new SimpleFileContainer("Name", "Path")); 

var deserialised = JsonConvert.DeserializeObject<SimpleFileContainer >(json); 

Assert.That(deserialised.Name, Is.EqualTo("Name"); 

à la fois les propriétés de nom et le chemin sont nuls à moins que je soit rendre la propriété fixe public ou ajouter la mise à jour la classe avec les attributs suivants:

[JsonObject(MemberSerialization.OptOut)] 
public class SimpleFileContainer : IDto 
{ 
    [JsonProperty] 
    public virtual string Name { get; protected set; } 

    [JsonProperty] 
    public virtual string Path { get; protected set; } 

    public SimpleFileContainer(string name, string path) 
    { 
     Name = name; 
     Path = path; 
    } 
} 

Ceci est une taille raisonnable projet qui utilise beaucoup le processus de sérialisation, je ne veux pas passer par le code en ajoutant ces attributs à chaque classe et membre.

Y a-t-il un moyen de contourner cela?

Répondre

7

J'ai eu ce même problème aujourd'hui. Heureusement Ayende avait la solution et je le partage avec vous. Lorsque vous configurez le sérialiseur, modifiez la propriété DefaultMembersSearchFlags sur le ContractResolver:

var serializer = new JsonSerializer 
         { 
          ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
          ContractResolver = new DefaultContractResolver 
           { 
            DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance 
           }, 
          TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple, 

          ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor 
         }; 
+2

Ce paramètre sérialise également les champs. Non seulement les propriétés. – Kugel