Sistema.En tiempo de ejecución.La serialización.Json.DataContractJsonSerializer.WriteObject ignora NonSerialized atributo, mientras que la serialización

Si trato de serializar un objeto de la siguiente ClassToSerialize clase con el Sistema.En tiempo de ejecución.La serialización.Json.DataContractJsonSerializer

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

La cadena que devuelve todavía contiene IsMf propiedad y su valor. El NOnSerialized atributo es ignorado. Por favor alguien puede sugerir qué atributo a utilizar cuando DataContractJsonSerializer para no serializar algunas propiedades

InformationsquelleAutor labroo | 2010-11-20

2 Kommentare

  1. 4

    El siguiente código funcionó para mí (es casi idéntica a la tuya con un par de pequeños errores de compilación fijo):

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

    De salida:

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

    • Yo upvoted Darin respuesta del porque es más precisa y completa y votada abajo de este, porque es engañoso. Sólo los miembros que están marcados con [DataMember] se serializan los otros no lo son. No hay necesidad de [NonSerialized], que es como se dio cuenta de que se omite.
  2. 2

    No, no la contienen. Usted debe ser confundido:

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

    De salida:

    {"PrimaryExc":"a"}

    Observación: no es necesario Que el [Serializable] atributo en la clase. Eso es sólo para la serialización binaria.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea