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.

¿Existe alguna forma de verificar el tipo de clase de un objeto ANTES de deserializarlo en C#?

Por ejemplo, tengo varios tipos de coches que se están serializando en un archivo .car (esto es un proyecto escolar). Tengo tres tipos diferentes: ford, lexus y dodge. Puedo guardarlos bien. Pero con la arquitectura actual de mi programa, cuando deserializo necesito conocer el tipo antes de deserializar. Por ejemplo, estoy serializando así:


if (CurrentCar.GetType() == typeof(Ford))
{
var JSON_CAR = JsonSerializer.Serialize((Ford)CurrentCar);
writer.Write(JSON_CAR);
}

Cuando deserializo, necesito saber el tipo antes de deserializar:

“`
CurrentCar = JsonSerializer.Deserialize<???>(reader.ReadString());
““

¿Cómo puedo lograr esto? Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes agregar una propiedad a cada objeto de carro serializado que identifique su tipo. Por ejemplo, podrías agregar una propiedad llamada “Tipo” que se establece en “Ford”, “Lexus” o “Dodge” según el tipo de carro. Luego, al deserializar el archivo, puedes leer primero esta propiedad para determinar el tipo de carro y luego deserializar en consecuencia.

    Aquí tienes un ejemplo de cómo podrías modificar tu código de serialización para incluir la propiedad de tipo:

    if (CurrentCar.GetType() == typeof(Ford))
    {
       var carData = new { Type = "Ford", Data = (Ford)CurrentCar };
       var JSON_CAR = JsonSerializer.Serialize(carData);
       writer.Write(JSON_CAR);
    }
    

    Y así es como podrías modificar tu código de deserialización para leer primero la propiedad de tipo y luego deserializar en función de ese tipo:

    var serializedCar = reader.ReadString();
    var deserializedCar = JsonSerializer.Deserialize<dynamic>(serializedCar);
    string carType = deserializedCar.Type;
    
    switch (carType)
    {
       case "Ford":
          CurrentCar = JsonSerializer.Deserialize<Ford>(deserializedCar.Data);
          break;
       case "Lexus":
          CurrentCar = JsonSerializer.Deserialize<Lexus>(deserializedCar.Data);
          break;
       case "Dodge":
          CurrentCar = JsonSerializer.Deserialize<Dodge>(deserializedCar.Data);
          break;
       default:
          throw new Exception("Tipo de carro no válido");
    }
    

    Ten en cuenta que esta solución requiere modificar el código que genera los objetos de carro serializados. Si no puedes modificar este código, es posible que necesites considerar un enfoque diferente, como usar un formato de archivo diferente que admita el almacenamiento de datos de manera estructurada (por ejemplo, XML).

Comments are closed.