es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Convertir retorna los valores predeterminados de un objeto creado.

Supongamos que tengo una clase simple llamada Cat, y me gustaría serializar y deserializar esta clase.

Clase Cat:

 public class Cat {
   public Cat () : base (Type.Cat)
     { 
       this.Origin = "American";
       this.Color = "Black";
     }
    [JsonConstructor]
    public Cat (bool Serialize) : base (Type.Cat) // base es la Clase Animal
     { 

     }
 }

Clase Animal:

public abstract class Animal {
   public string Color {
      get;
      set;
   }
   public string Origin {
      get;
      set;
   }
   public Animal(Type AnimalType)
   { 

   }
}

Método Serialize:

public void SerializeObj(Cat cat)
{
    var mysettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, 
    Formatting = Newtonsoft.Json.Formatting.Indented };

    var json = JsonConvert.SerializeObject(cat, typeof(Cat), mysettings );

    using (StreamWriter stream = new StreamWriter(path))
    {
        stream.WriteLine(json);
        stream.Close();
    }
}

Método Deserialize:

public object Deserialize(string object)
{
    var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto };

    var cat = JsonConvert.DeserializeObject<Cat>(object, settings);

    return cat;
}

Llamando a los dos métodos:

Cat cat = new Cat();
cat.Color = "White";
cat.Origin = "Europe";
var fileString = Serialize(cat);

// archivo creado con fileString

Cat cat = Deserialize(myfile);
Console.WriteLine(cat.Origin); // imprimirá American
Console.WriteLine(cat.Color); // imprimirá Black

El problema es que la deserialización produce los valores predeterminados en lugar de los valores modificados al serializar.

Ten en cuenta que myfile contiene los valores actualizados ( Color = “White” y Origin = “Europe”)

¿Cómo puedo solucionar este problema?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para solucionar este problema, puedes añadir setters públicos a las propiedades Color y Origin en la clase Cat. Esto permitirá que el proceso de deserialización establezca los valores de estas propiedades basándose en los valores del archivo JSON.

    public class Cat {
        public Cat() : base(Type.Cat)
        { 
            this.Origin = "Americano";
            this.Color = "Negro";
        }
    
        [JsonConstructor]
        public Cat(bool Serializar) : base(Type.Cat) // base es la clase Animal
        { 
    
        }
    
        public string Color { get; set; }
        public string Origin { get; set; }
    }
    

    Con este cambio, el método Deserialize debería establecer correctamente los valores de Color y Origin basándose en el archivo JSON.

Comments are closed.