JSON-Namen von CLR-Namen trennen
JSON-Verbraucher erwarten ein bestimmtes Dokument. JsonPropertyName legt bei System.Text.Json den Namen einer Eigenschaft ausdrücklich fest. Prüfe Serialisierung und Deserialisierung: Ein korrektes Ausgabedokument ist nur die Hälfte des Vertrags. Das Attribut garantiert nicht, dass jeder Obfuscator alle per Reflection verwendeten Mitglieder oder Konstruktoren erhält.
Einen Roundtrip ausführen
Kompiliere den folgenden Code als .NET-8-Konsolenprojekt. Vor und nach dem Schutz soll json-contract=OK erscheinen. Arbeite in einer Kopie des Ausgabeverzeichnisses und ersetze nur die Anwendungsassembly. Das Beispiel prüft order_id und das zurückgelesene DTO. Ergänze deine Naming Policies, Enum-Darstellung, Konstruktorwahl und Converter.
Textbasierte Namenssuche erfassen
Type.GetType, GetMethod, Konfiguration und Plugin-Suche können normale kompilierte Referenzen umgehen. Gehe nicht davon aus, dass beliebige Strings umgeschrieben werden. Nutze nach Möglichkeit explizite Registrierungen und teste trotzdem den Produktionsweg. Erhaltene öffentliche APIs helfen kompilierten Verbrauchern, garantieren aber keine internen Reflection-Abfragen.
Beide Seiten des Deployments prüfen
Lies gespeicherte Dokumente der alten Version mit dem geschützten Build. Lass einen unveränderten Verbraucher die DLL aufrufen, lade echte Plugins und öffne relevante Ansichten. Teste fehlende und null-Werte. Source-generierte Serialisierung reduziert teilweise Reflection, repariert aber keine beliebige Umbenennung. Ist ein benötigter Vertrag nicht sicher, schränke den Schutz ein oder wähle einen passenden Ablauf.
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");
}
}