Distinguer nom JSON et nom CLR
Les consommateurs JSON dépendent du document échangé. JsonPropertyName définit explicitement le nom JSON d’une propriété avec System.Text.Json. Vérifiez écriture et lecture : produire le bon document ne teste que la moitié du contrat. Cet attribut ne garantit pas que tout obfuscateur préserve chaque membre, constructeur ou convertisseur utilisé par réflexion.
Effectuer un aller-retour
Compilez le code ci-dessous dans un projet console .NET 8. Il doit afficher json-contract=OK avant et après protection. Utilisez une copie du dossier de sortie et remplacez uniquement l’assembly concerné. L’exemple vérifie order_id et la lecture du DTO. Ajoutez vos politiques de noms, représentations d’énumérations, choix de constructeurs et convertisseurs.
Recenser les noms stockés en texte
Type.GetType, GetMethod, configuration et découverte d’extensions peuvent contourner les références compilées ordinaires. Ne supposez pas que toutes les chaînes seront réécrites. Préférez des enregistrements explicites quand c’est possible, puis testez le mécanisme réel. Une API publique préservée aide les consommateurs compilés, sans garantir toutes les recherches internes par réflexion.
Tester les deux côtés du déploiement
Lisez avec la version protégée des documents enregistrés par l’ancienne. Faites appeler la DLL par un consommateur inchangé, chargez une extension réelle et ouvrez les écrans concernés. Testez valeurs absentes et nulles. La génération de sérialisation réduit parfois la réflexion, mais ne répare pas tout renommage. Si un contrat nécessaire ne peut être maintenu, limitez la protection ou choisissez un autre processus.
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public sealed class OrderDto
{
[JsonPropertyName("order_id")]
public int Id { get; set; }
}
public static class Program
{
public static void Main()
{
string json = JsonSerializer.Serialize(new OrderDto { Id = 42 });
var copy = JsonSerializer.Deserialize<OrderDto>(json);
if (json != "{\"order_id\":42}" || copy?.Id != 42)
throw new InvalidOperationException("JSON contract changed");
Console.WriteLine("json-contract=OK");
}
}