2010-11-20 3 views
4

Si je tente de sérialiser un objet de la classe ClassToSerialize suivante avec System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject ignore l'attribut NonSerialized lors de la sérialisation

[DataContract,Serializable] 
public class ClassToSerialize 
{ 
    [NonSerialized] private bool _mf; 
    public bool IsMf 
    { 
     get { return _mf}; 
     set{ _mf = value;} 
    } 

    [DataMember] 
    public char PrimaryExc { get; set; }   
} 

public class TestClass 
{ 
    ClassToSerialize obj = new ClassToSerialize{PrimaryExchange = 'a', NoResults = true}; 
    var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(ClassToSerialize); 
    var ms = new MemoryStream(); 
    serializer.WriteObject(ms, obj); 
    return Encoding.UTF8.GetString(ms.ToArray()); 
} 

Le retour string contient toujours la propriété IsMf et sa valeur. L'attribut NOnSerialized est ignoré. Quelqu'un peut-il s'il vous plaît suggérer quel attribut à utiliser lors de l'utilisation DataContractJsonSerializer afin de ne pas sérialisation des propriétés

Répondre

4

Le code suivant a fonctionné pour moi (il est presque identique à la vôtre avec quelques petites erreurs de compilation fixes):

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 
using System.Text; 

class Program 
{ 
    static void Main() 
    { 
     var obj = new ClassToSerialize 
     { 
      PrimaryExc = 'a', 
      NoResults = true 
     }; 

     var serializer 
      = new DataContractJsonSerializer(typeof(ClassToSerialize)); 

     var ms = new MemoryStream(); 

     serializer.WriteObject(ms, obj); 

     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
    } 
} 

[DataContract] 
[Serializable] 
public class ClassToSerialize 
{ 
    [NonSerialized] 
    private bool _mf; 

    public bool IsMf 
    { 
     get { return _mf; } 
     set { _mf = value; } 
    } 

    [DataMember] 
    public bool NoResults { get; set; } 

    [DataMember] 
    public char PrimaryExc { get; set; } 
} 

sortie:

{"NoResults":true,"PrimaryExc":"a"}

+0

J'ai mis à jour la réponse de Darin parce qu'elle est plus précise et plus complète et qu'elle est downvoted celle-ci parce qu'elle est trompeuse. Seuls les membres marqués avec [DataMember] sont sérialisés, les autres ne le sont pas. Pas besoin de [NonSerialized] qui est comme vous avez remarqué est ignoré. –

2

Non, il ne le contient pas. Vous devez vous tromper:

[DataContract] 
public class ClassToSerialize 
{ 
    [NonSerialized] 
    private bool _mf; 
    public bool IsMf 
    { 
     get { return _mf; } 
     set{ _mf = value;} 
    } 

    [DataMember] 
    public char PrimaryExc { get; set; }   
} 

class Program 
{ 
    static void Main() 
    { 
     var obj = new ClassToSerialize 
     { 
      PrimaryExc = 'a', 
      IsMf = false 
     }; 
     var serializer = new DataContractJsonSerializer(obj.GetType()); 
     serializer.WriteObject(Console.OpenStandardOutput(), obj); 
    } 
} 

Sortie:

{"PrimaryExc":"a"} 

Remarque: Vous n'avez pas besoin de l'attribut [Serializable] de votre classe. C'est seulement pour binary serialization.

Questions connexes