sábado, 28 de diciembre de 2019

Serializar un archivo JSON

Comprendiendo la serialización

La serialización es el proceso de transformar un objeto en una forma que pueda persistir para ser almacenado  o transferido de un dominio de aplicación a otro. Al transformar el objeto, se serializa el objeto; cuando se lee de nuevo, se deserializa el objeto. Se puede serializar un objeto hacia un disco, una secuencia de memoria o hacia  una red. Dos formatos comunes para pasar  objetos entre sistemas son XML y JSON. 

Los objetos son serializados en XML o JSON antes de ser transferidos al cliente. El Framework de.NET tiene clases que admiten binarios, XML y JSON, e incluso podemos crear nuestra propia serialización personalizada.

Serializar un archivo JSON
Más fotos de este estilo.


Serialización JSON

JSON es similar a XML, excepto que es menos detallado. JSON aparece como un par nombre \ valor pero también habilita relaciones de uno a muchos, como cuando tenemos un objeto de factura y los detalles de la factura. Es necesaria algo más de codificación con JSON porque necesita poner explícitamente un atributo antes de cada propiedad o el campo que deseamos serializar. Además, debemos agregar el atributo [DataContract] antes de la declaración de la clase. El siguiente código muestra cómo cambiar el código para la Clase persona para permitir la serialización JSON:

[DataContract] 
public class Person 
{
 [DataMember]
 private int _id;
 [DataMember]
 public string FirstName;
  [DataMember] 
public string LastName;
public void SetId(int id)
  { _id = id; }
 }

En Visual Basic sería

<DataContract>
Public Class Person
    <DataMember>
    Private _id As Integer
    <DataMember>
    Public FirstName As String
    <DataMember>
    Public LastName As String

    Public Sub SetId(ByVal id As Integer)
        _id = id
    End Sub
End Class

Para ignorar un campo o propiedad, no debemos colocar el atributo [DataMember] frente a su declaración. Para serializar un objeto a JSON, utilizamos  la clase DataContractJsonSerializer. Esta la clase está en el espacio de nombres System.Runtime.Serialization.Json. El siguiente código serializa la persona creando un objeto persona y metiéndolo en un archivo Persona.JSON:

Persona persona = new Persona();
 persona.SetId(1);
 persona.FirstName = "Joe";
 persona.LastName = "Smith";
 Stream stream = new FileStream("Persona.json", FileMode.Create);
 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Persona)); 
ser.WriteObject(stream, persona); stream.Close();

En lugar de llamar a un método de serialización, llama al método WriteObject. El JSON para  la persona objeto es:

{
 "FirstName":"Joe", 
"LastName":"Smith",
 "_id":1
 }

El código para leer el JSON de vuelta al objeto sería de este tipo:

Person person = new Person();
 Stream stream = new FileStream("Person.json",FileMode.Open); 
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person));
 person = (Person)ser.ReadObject(stream); stream.Close();

Serialización personalizada

Hay dos métodos para personalizar los procesos de serialización. El primero es agregar un atributo antes de un método personalizado que manipule los datos del objeto durante y después de la finalización de la serialización o deserialización. Se pueden utilizar cuatro atributos para esto: 

OnDeserializedAttribute,OnDeserializingAttribute, OnSerializedAttribute y OnSerializingAttribute. 

Añadiendo estos atributos antes de que una declaración de método dispare este método durante o después del proceso de serialización o deserialización. El código mostrado a continuación se puede agregar a la clase Person para personalizar la lógica de serialización:

[OnSerializing()]
 internal void OnSerializingMethod(StreamingContext context)
 { 
FirstName = "Bob"; 
[OnSerialized()]
 internal void OnSerializedMethod(StreamingContext context)
 { 
FirstName = "Serialize Complete";
 } 
[OnDeserializing()]
 internal void OnDeserializingMethod(StreamingContext context)
FirstName = "John";
 } 
[OnDeserialized()] 
internal void OnDeserializedMethod(StreamingContext context)
 { 
FirstName = "Deserialize Complete";

Si ejecutamos el código para cualquiera de los objetos del serializador y colocamos puntos de interrupción en cada método, podemos ver cuando se llama a cada método. Esto nos permite personalizar la entrada o salida en caso de que tengamos mejoras en nuestros objetos en versiones posteriores, y propiedades que faltan en nuestros archivos persistentes.

El uso de los cuatro atributos se considera la mejor práctica que implementar el Interfaz ISerializable. También es más fácil de implementar. Los métodos de atributo lo que nos permite manipular el objeto subyacente antes o después de la serialización o deserialización.

La implementación de la interfaz ISerializable intercepta el proceso de  serialización \ deserialización  y puede tener resultados inesperados cuando se trabaja con objetos que heredan de otro objeto que necesita ser serializado o deserializado.

Más información sobre serialización: 
Cómo salvar los datos de una instancia 

No hay comentarios:

Publicar un comentario