2010-11-20 3 views
4

Serialisierung Wenn ich versuche, mit System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject ignoriert NonSerialized Attribut während

[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()); 
} 

Die Rückkehr ein Objekt der folgenden ClassToSerialize Klasse zu serialisiert Die Zeichenfolge enthält weiterhin die IsMf-Eigenschaft und ihren Wert. Das NOnSerialized-Attribut wird ignoriert. Kann jemand bitte vorschlagen, was zu verwenden Attribut, wenn DataContractJsonSerializer verwendet, um nicht einige Eigenschaften zu serialisiert

Antwort

4

Der folgende Code für mich gearbeitet (es ist fast identisch mit Ihrer mit ein paar kleinen Kompilierungsfehlern fest):

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

Ausgang:

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

+0

Ich habe die Antwort von Darin hochgestuft, weil sie genauer und vollständiger ist und diese nicht datiert, weil sie irreführend ist. Nur Mitglieder, die mit [DataMember] markiert sind, werden serialisiert, die anderen nicht. Keine Notwendigkeit für [NonSerialized], das, wie Sie bemerkt haben, ignoriert wird. –

2

Nein, es enthält es nicht. Sie müssen verwechselt werden:

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

Ausgang:

{"PrimaryExc":"a"} 

Anmerkung: Sie brauchen nicht die [Serializable] Attribut auf Ihrer Klasse. Das ist nur für binary serialization.

Verwandte Themen