Hace poco, andaba enfrascado en el proceso de modernización de una aplicación antigua que, entre otras cosas, guardaba datos en formato JSON en un repositorio de archivos. Dado que se trataba de una aplicación creada con .NET "clásico", la serialización y deserialización de estos datos se realizaba utilizando la popular biblioteca Newtonsoft.Json.
Al pasar a versiones modernas de .NET, esta biblioteca ya no es la mejor opción, pues ya el propio framework nos facilita las herramientas necesarias para realizar estas tareas de forma más eficiente mediante los componentes del espacio de nombres System.Text.Json
. Y aquí es donde empiezan a explotar las cosas 😉.
Si habéis trabajado con este tipo de asuntos, probablemente habréis notado que, por defecto, los componentes de deserialización creados por James Newton-King son bastante permisivos y dejan pasar cosas que System.Text.Json
no permite. Por ejemplo, si tenemos una clase .NET con una propiedad de tipo string
y queremos deserializar un valor JSON numérico sobre ella, Newtonsoft.Json
lo hará sin problemas, pero System.Text.Json
nos lanzará una excepción. Esa laxitud de Newtonsoft.Json
es algo que en ocasiones nos puede venir bien, pero en otras puede puede hacer pasar por alto errores en nuestros datos que luego, al ser procesados por componentes de deserialización distintos, podrían ocasionar problemas.
Por ejemplo, observad el siguiente código:
var json = """
{
"Count": "1234"
}
""";
// Deserializamos usando Newtonsoft.Json:
var nsj = Newtonsoft.Json.JsonConvert.DeserializeObject<Data>(json);
Console.WriteLine("Newtonsoft: " + nsj.Count);
// Intentamos deserializar usando System.Text.Json
// y se lanzará una excepción:
var stj = System.Text.Json.JsonSerializer.Deserialize<Data>(json);
Console.WriteLine("System.Text.Json: " + stj.Count);
Console.Read();
// La clase de datos utilizada
record Data(int Count);
Para casos como este, nos vendrá bien conocer qué son los custom converters y cómo podemos utilizarlos.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Cómo saber dónde se está gestionando una petición en ASP.NET Core
José María Aguilar - Inicialización de propiedades en C# 6.0
José María Aguilar
.NET Core / .NET
- .NET 9 Preview 1
Rich Lander - Announcing NuGet 6.9
Allie Barry - Our Vision for .NET 9
.NET Team - Hello, Redis - Getting Started with Redis and dotnet 8
Steve Smith - Garbage Collector (over)simplified & The garbage collector in .NET - Part 2: Compacting
Steven Giesel - Convert Between Hexadecimal and Decimal in C#
Martin Chege - Creating an HttpClient that uses DNS over Https
Gérald Barré - What Is the Difference Between Properties and Fields in C#
Code Maze - LINQ MindMap: .NET 9 Edition
Steven Giesel - Creating custom PowerToys Run plugins
Henrik Lau Eriksson - How to Overwrite DateTime.Now During Testing in .NET
Ivan Gechev - Is Random.GetItems the best way to get random items in C# 12?
Davide Bellone - New Features in C# 12
Bozo Spoljaric - How to Log a Class and Method Names Using Serilog
Muhammad Afzal Qureshi - Enumerating over Select’s index
Jiří Činčura - Weak Events in C# – How to Avoid Nasty Memory Leaks
Nick Cosentino - Polly Core Rate Limiter
Bryan Hogan - An Introduction to the World of Containers with .NET 8
James Montemagno
Como seguramente sabréis, Blazor es la gran apuesta de Microsoft para el desarrollo de aplicaciones web con .NET. Sólo hay que ver la cantidad de novedades que han introducido en la última versión para darse cuenta de que están poniendo toda la carne en el asador y, de alguna forma, está convirtiéndose en la opción preferida para el desarrollo de este tipo de aplicaciones.
Pues bien, es un placer anunciaros que, tras varios meses de preparación, hace unos días hemos puesto en marcha el nuevo curso de desarrollo de aplicaciones Web con Blazor en .NET 8, como siempre, en CampusMVP.
Ha sido un trabajo duro, porque esta última versión ha venida cargada de novedades (sobre todo en lo relativo al nuevo modelo unificado propuesto por las Blazor Web Apps) y hemos tenido que revisar en profundidad y reescribir parte del contenido del curso, rehacer ejemplos y regrabar material audiovisual, todo con el objetivo de seguir siendo el mejor y más completo curso de Blazor del mercado.
En este post voy a intentar responder a las siguientes preguntas:
- ¿Qué es Blazor?
- ¿Por qué es interesante aprender a desarrollar con Blazor?
- Si ya hemos trabajado con ASP.NET Core y MVC, ¿siguen valiendo estos conocimientos?
- ¿En qué consiste el curso de desarrollo con Blazor?
- ¿Cuáles son los contenidos del curso?
- ¿Qué conocimientos previos se necesitan para seguir el curso?
- Me convence, ¿cuándo empezamos?
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Evitar que código de pruebas llegue a producción usando directivas de compilación de C#
José María Aguilar - Ejecutar tareas en segundo plano en ASP.NET 4.5.2
José María Aguilar
.NET Core / .NET
- Volcados de memoria en Kubernetes para depurar aplicaciones .NET
CampusMVP - Enable the new TerminalLogger in .NET 8 SDK automatically
Gérald Barré - How to Correctly Implement IDisposable Interface in C#
Code Maze - General Performance Tip: Optimizing Attributes
David McCarter - Exploring .NET frozen segments
Kevin Gosse - Using default interface methods for performance gains in IHeaderDictionary
Andrew Lock - How to Pass Complex Parameters to Theory in xUnit
Code Maze - How to Get appsettings.json Content as a Dictionary in .NET Core
Code Maze - .NET 8–It’s time to get rid of these flaky tests!
Bart Wullems - Resilience and chaos engineering
Martin Tomka
Hace unos días, veíamos por aquí los constructores primarios de C#, una característica recientemente introducida en el lenguaje que permite omitir el constructor si en éste lo único que hacemos es asignar los valores de sus parámetros a campos de la clase.
Veamos un ejemplo a modo de recordatorio rápido:
// Clase con constructor tradicional
public class Person
{
private readonly string _name;
public Person(string name)
{
_name = name;
}
public override string ToString() => _name;
}
// La misma clase usando el constructor primario:
public class Person(string name)
{
public override string ToString() => name;
}
Como comentamos en el post, los parámetros del constructor primarios eran internamente convertidos en campos privados de la clase, generados automáticamente e inaccesibles desde el código.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Modificar en tiempo de ejecución el valor de los settings de una aplicación ASP.NET Core
José María Aguilar - Eager loading en Entity Framework: mejora drástica del rendimiento en acceso a datos
José María Aguilar
.NET Core / .NET
- Thread.Sleep vs Task.Delay en .NET: cómo introducir retardos en tu código correctamente
José Manuel Alarcón - The fastest way to create WireMock.NET mappings
Cezary Piątek - How to Create XML Files in C#
Matjaz Prtenjak - GetHashCode() in .NET Core
Bart Wullems - Consuming WCF Services in .NET 8 (.NET Core is no more!)
DeeDee Walsh - Tales from the .NET Migration Trenches - Hangfire
Jimmy Bogard - Checking if a collection is empty in C#
Gérald Barré - From Hours to Seconds: The Journey to a 630x Faster Batch Job
Fati Iseni - How to Build a URL Shortener With .NET
Milan Jovanović - Understanding C# 8 default interface methods
Andrew Lock - .NET Tasks, List’s ForEach, and Problems
Khalid Abuhakmeh - How to Select Multiple Records Based on a List of IDs Using LINQ
Bozo Spoljaric - How to Properly Create Message Templates for Logging in C#
Vadzim Zylevich - .NET 8–Refresh memory limit
Bart Wullems - How To Use ArraySegment in C#
Kamil Pakula - Using Azure OpenAI Service to generate images with DALL-E in .NET
Daniel Gomez - HigLabo.Mapper, Creating Fastest Object Mapper in the world with Expression Tree in 10 Days
Higty - Matrix Inverse from Scratch Using SVD Decomposition with C#
James McCaffrey - SearchValues object become better with .NET 9
Steven Giesel