Connect with us

Entwicklung & Code

Neu in .NET 10.0 [36]: Neue Einstellungssammlung mit Best Practices für JSON


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Der JSON-Serialisierer System.Text.Json bietet in Version 10.0 unter JsonSerializationOptions.Strict neue Optionen an, darunter JSON AllowDuplicateProperties = false.

Weiterlesen nach der Anzeige


Der Dotnet-Doktor – Holger Schwichtenberg

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

JsonSerializationOptions.Strict setzt Einstellungen, die Microsoft in den Release Notes als „Best Practices“ bezeichnet:

  • UnmappedMemberHandling = Disallow
  • AllowDuplicateProperties = false
  • RespectNullableAnnotations = true
  • RespectRequiredConstructorParameters = true



Vergleich der Eigenschaften von JsonSerializerOptions.Default (oben) und JsonSerializerOptions.Strict (unten) (Abb. 1)


betterCode() .NET 11.0

betterCode() .NET 11.0

(Bild: King / stock.adobe.com)

Das ist neu in .NET 11.0: Dr. Holger Schwichtenberg und weitere Experten präsentieren am 17. November 2026 auf der Online-Konferenz betterCode() .NET 11.0 die Änderungen für Entwicklerinnen und Entwickler. Tickets zum Frühbucherpreis sind im Online-Shop verfügbar.

Diese Einstellungen sind lesekompatibel mit JsonSerializationOptions.Default, das heißt, ein mit JsonSerializationOptions.Default serialisiertes Objekt kann mit JsonSerializationOptions.Strict deserialisiert werden. Der folgende Codeausschnitt führt zum Laufzeitfehler „The JSON property ‚ID‘ could not be mapped to any .NET member contained in type ‚Person‘.“:


public void JSONStrict()
{
 CUI.Demo(nameof(JSONStrict));
 
 CUI.H2("JSON-Dokumente mit doppelten Eigenschaften");
 string json = """{ "ID": 123, "FirstName": "Holger", "LastName": "Schwichtenberg", "LastName": "www.IT-Visions.de" }""";
 Console.WriteLine(json);
 
 CUI.H2("Deserialisierung im Standard");
 var person = JsonSerializer.Deserialize(json);
 Console.WriteLine(person); // AUSGABE: Person: Holger www.IT-Visions.de
 
 try
 {
  CUI.H2("Deserialisierung mit JsonSerializerOptions.Strict");
  Console.WriteLine(JsonSerializerOptions.Strict.ToNameValueString());
  JsonSerializer.Deserialize(json, JsonSerializerOptions.Strict); // throws JsonException "The JSON property 'ID' could not be mapped to any .NET member"
 }
 catch (Exception ex)
 {
  CUI.PrintError(ex);
 }
}


Der zweite Fehler des doppelten Wertes für "LastName" wird nicht ausgegeben, da System.Text.Json leider immer nur den ersten Fehler liefert.

Weiterlesen nach der Anzeige

JsonSerializationOptions.Strict kann auch beim Serialisieren eingesetzt werden. Allerdings machen die meisten Einstellungen dabei keinen Unterschied.

Hier ist ein Beispiel, in dem JsonSerializerOptions.Strict einen Unterschied bei Serialize() macht:

#nullable enable

Wenn man dann eine Property in Person auf null lässt, kommt:

The property or field 'PrivateEmail' on type 'Person' doesn't allow getting null values.

Das liegt daran, dass JsonSerializerOptions.Strict die Eigenschaft RespectNullableAnnotations = true setzt. Das ist aber im engeren Sinne nicht neu in .NET 10.0. RespectNullableAnnotations wurde in .NET 9.0 eingeführt.


(rme)



Source link

Entwicklung & Code

Herdr: Terminal-Multiplexer sortiert Flotten von Coding-Agenten


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Wer mehrere Coding-Agenten parallel an verschiedenen Projekten arbeiten lässt, muss auf deren Ausgaben warten und vor allem den Überblick behalten: Welcher Agent rechnet noch, welcher ist fertig, und wo blockiert eine Rückfrage den nächsten Schritt? Genau an dieser Stelle setzt Herdr an. Der freie Terminal-Multiplexer hält Sitzungen am Leben, ordnet sie nach Projekten und fasst den Zustand von Agenten in einer Seitenleiste zusammen.

Weiterlesen nach der Anzeige

Das im März 2026 veröffentlichte Projekt hat inzwischen auch institutionellen Rückhalt erhalten. Gründer Can Celik kündigte Anfang August die Aufnahme in den Herbstjahrgang 2026 des US-Gründerprogramms Y Combinator an. Y Combinator führt Herdr als Ein-Personen-Unternehmen mit Sitz in Ankara. Y Combinators Standard Deal investiert in jedes aufgenommene Start-up 500.000 US-Dollar. Eine weitere, individuelle Finanzierungsrunde nennt Herdrs Ankündigung nicht.

Herdr liefert kein Sprachmodell und ersetzt keine Agenten wie Claude Code, Codex oder OpenCode. Als auf Coding-Agenten zugeschnittener Konkurrent zu tmux führt Herdr gewöhnliche Terminal-Prozesse aus, ergänzt deren Darstellung aber um die Zustände working, blocked, done,idle und unknown. Die aktuelle stabile Ausgabe ist 0.9. Das in Rust entwickelte Programm steht unter der Apache-2.0-Lizenz. Binärpakete gibt es für Linux und macOS auf x86-64 und ARM64 sowie für Windows auf x86-64. Hinzu kommen unter anderem Homebrew, Nix und mise. Einzelne Funktionen bleiben unter Windows eingeschränkt.

Die Herdr-Architektur folgt dem Client-Server-Modell klassischer Terminal-Multiplexer. Ein Server stellt die Terminal-Instanzen bereit, unter Unix als Pseudoterminals (PTYs) und unter Windows per ConPTY-Konsolen. Der Client stellt diese nur dar, sodass Shells, Entwicklungsserver und Agenten weiterlaufen, sollte er getrennt werden. Herdr organisiert Terminals in Workspaces, Tabs und Panes, sodass der Nutzer sie entsprechend seines eigenen Workflows gruppieren kann.

Um die Aufmerksamkeit des Nutzers auf die richtigen Agenten lenken zu können, erkennt Herdr Zustände der KI-Agenten per Hook, Plugin oder die Analyse der Terminal-Ausgabe. Optionale Integrationen liefern je nach Werkzeug zusätzlich Sitzungskennung oder Informationen zum Lebenszyklus. Herdr verdichtet die Zustände auf Workspace-Ebene und meldet unbeachtete Rückfragen.

Auch Automatisierung ist vorgesehen. Über Kommandozeile und eine lokale Socket-API lassen sich Panes anlegen, Ein- und Ausgaben übertragen sowie Agentenzustände abfragen. Unter Unix nutzt sie einen Unix Domain Socket, unter Windows eine Named Pipe. Auch tmux lässt sich automatisieren, allerdings ohne die native Integration von Agenten und deren Zuständen.

Weiterlesen nach der Anzeige

Beim Trennen eines Clients oder bei einem Netzwerkausfall laufen Server und Prozesse weiter. Nach einem Neustart des Herdr-Servers oder Rechners dagegen sind Prozesse natürlich beendet. Laut der Restore-Matrix des Projekts stellt Herdr dann Workspaces, Tabs, Pane-Aufteilung, Arbeitsverzeichnisse und Fokus wieder her und setzt Agenten, die das unterstützen, über deren native Sitzungskennung fort.

Die optionale Speicherung der Terminal-Historie ist standardmäßig abgeschaltet, weil sie Zugangsdaten, Token oder Prompts enthalten kann. Ein experimentelles Live-Handoff versucht, Prozesse bei bestimmten Updates zu erhalten, bietet dafür aber keine Garantie.

Auch bei entfernten Rechnern ersetzt Herdr nicht SSH. Nutzer können sich wie gewohnt anmelden und Herdr dort starten. Alternativ verbindet die Remote-Funktion herdr --remote host einen lokalen Herdr-Client über OpenSSH mit einem Herdr-Server. OpenSSH übernimmt Authentifizierung und Host-Key-Prüfung. Als Ziel unterstützt dieser Modus nur Linux und macOS. Windows kann seit Herdr 0.8.2 als lokaler Client dienen, aber nicht als Server.

Seit Version 0.9.0 können mehrere Clients unabhängig voneinander verschiedene Workspaces und Tabs anzeigen. Unterschiedliche Tabs passen sich der Größe des jeweiligen Clients an. Teilen sich Clients einen Tab, bestimmt der zuletzt darin aktive Client dessen Größe.

Die am 7. September 2026 veröffentlichte Version bündelt außerdem lokale und per SSH angebundene Server in einem Fenster. Eine gemeinsame Agentenliste zeigt deren Zustände. Während die ausgewählte Maschine die sichtbaren Terminal-Inhalte liefert und Eingaben erhält, aktualisieren die übrigen Verbindungen weiterhin Statusinformationen und Benachrichtigungen. Diese Funktion wird derzeit unter Linux und MacOS unterstützt. Ein gespeichertes Maschinenprofil bindet jeweils eine Sitzung ein, nicht sämtliche Sitzungen eines Hosts.

Besonders sichtbar wurde Herdr durch Omarchy, die Linux-Distribution des umstrittenen David Heinemeier Hansson. Deren vierte Hauptversion Quattro hat den Multiplexer zusätzlich zu tmux integriert. Die mitgelieferte Konfiguration orientiert sich mit Ctrl+Space als Prefix an Omarchys tmux-Belegung. Die Versionshinweise zu Herdr 0.8.2 nennen DHH als Mitwirkenden an Fenstertiteln, Pane-Größenänderung und Tab-Verschiebung. Omarchy ist damit Konsument und DHH Contributor.

Für ein oder zwei Sitzungen, deren Inhalt bekannt ist, bleibt ssh plus tmux die nüchterne Wahl. tmux ist seit fast zwei Jahrzehnten erprobt, breit paketiert und detailliert konfigurierbar. Wer Statusleisten, Hooks und Benachrichtigungen eingerichtet hat, gewinnt durch einen Wechsel womöglich wenig.

Herdr wird interessanter, wenn mehrere Agenten über Repositories und Rechner verteilt arbeiten und die menschliche Aufmerksamkeit knapp wird. Statusübersicht, Benachrichtigungen, Sitzungswiederaufnahme und semantische API reduzieren dann Eigenbau. Mausbedienung und repositoryorientierte Organisation senken zudem die Einstiegshürde.

Herdr bleibt jedoch jung: In weniger als fünf Monaten sprang es von Version 0.1 auf 0.8. Auch der Plugin-Marktplatz ist keine kuratierte vertrauenserweckende Anlaufstelle. Einträge werden laut Projekt automatisch erfasst und nicht geprüft. Plugins, Hooks und Socket-API haben Zugriff auf Entwicklungsumgebung und Terminal-Inhalte und verlangen entsprechende Vorsicht.

Somit macht Herdr tmux nicht überflüssig. Es behandelt Terminals zusätzlich als Warteschlange für menschliche Entscheidungen. Ob das ein eigenes Laufzeitsystem rechtfertigt, hängt weniger von der Zahl offener Panes ab als davon, wie oft eines unbemerkt auf eine Antwort wartet.


(axk)



Source link

Weiterlesen

Entwicklung & Code

Microsoft leitet letzte Phase für SQL Data Sync ein


Microsoft hat die nächste Stufe bei der Einstellung von SQL Data Sync gezündet: Seit dem 9. September lassen sich in Azure-Abonnements, die den Dienst bislang nicht genutzt haben, keine neuen SQL-Data-Sync-Bereitstellungen mehr anlegen. Bestehende Nutzer können Sync-Gruppen und Mitgliedsdatenbanken dagegen noch bis zum vollständigen Aus des Dienstes am 30. September 2027 erstellen, ändern und betreiben.

Weiterlesen nach der Anzeige

Die Einstellung hatte Microsoft bereits 2024 mit dreijähriger Übergangsfrist angekündigt. SQL Data Sync gleicht ausgewählte Daten zwischen mehreren Datenbanken ab, sowohl zwischen Azure SQL Database als auch mit SQL-Server-Instanzen im eigenen Rechenzentrum. Die Daten können dabei je nach Konfiguration in beide Richtungen fließen. Microsoft beschreibt die Einstellung und die vorgesehenen Migrationspfade in seiner Dokumentation.

Die neue Einschränkung trifft ausdrücklich ausschließlich Azure-Abonnements, die SQL Data Sync zuvor nie eingesetzt haben. Für Abonnements, die SQL Data Sync bereits nutzen, ändert sich zunächst nichts: Administratoren dürfen weiterhin Sync-Gruppen anlegen und verwalten sowie Datenbanken als Mitglieder hinzufügen. Microsoft will damit verhindern, dass kurz vor dem Endtermin noch neue Abhängigkeiten von dem auslaufenden Dienst entstehen. Die Details zur nun begonnenen letzten Ausmusterungsphase nennt Microsoft im Azure-SQL-Blog.

SQL Data Sync organisiert die Replikation in Sync-Gruppen nach einem Hub-and-Spoke-Prinzip. Als Hub dient stets eine Azure SQL Database; weitere Azure-SQL-Datenbanken oder SQL-Server-Datenbanken können als Mitglieder teilnehmen. Bei lokalen SQL-Server-Datenbanken ist zusätzlich ein lokaler Sync-Agent nötig. Der Dienst kann Daten in beide Richtungen oder nur vom Hub zu einem Mitglied beziehungsweise umgekehrt übertragen.

Microsoft rät betroffenen Organisationen, zunächst alle vorhandenen Bereitstellungen zu erfassen – auch inaktive Sync-Gruppen. Dazu gehören Hub- und Mitgliedsdatenbanken, gegebenenfalls installierte Sync-Agenten sowie die Anwendungen, die auf replizierte Daten angewiesen sind. In kleineren Umgebungen lassen sich die Sync-Gruppen über den Bereich „Sync to other databases“ einer Azure SQL Database im Azure-Portal prüfen. Für größere Azure-Landschaften verweist Microsoft auf die PowerShell und die Azure-SQL-Management-REST-API.

Vor der Umstellung sollten Administratoren außerdem Datenfluss, Synchronisierungsrichtung, Intervall, Datenvolumen sowie Anforderungen an Latenz und Verfügbarkeit festhalten. Das ist wichtig, weil SQL Data Sync kein einheitliches Nachfolgeprodukt erhält. Je nach bisherigem Einsatz kann die Migration eine bloße Umkonfiguration sein oder einen Umbau der Replikationsarchitektur erfordern.

Weiterlesen nach der Anzeige

Für geplante oder inkrementelle Übertragungen nennt Microsoft Azure Data Factory als Alternative. Das eignet sich etwa, wenn Daten in festen Intervallen für ein Data Warehouse oder einen Reporting-Bestand kopiert werden sollen. Für die einseitige Verteilung von SQL Server zu Azure SQL Database verweist der Konzern auf die transaktionale Replikation.

Geht es vor allem um lesende Replikate oder regionale Verfügbarkeit, kommen etwa aktive Georeplikation und Read Replicas infrage. Für Reporting-Replikate vollständiger Datenbanken nennt Microsoft Always On Availability Groups bei SQL Server auf Azure-VMs sowie Managed Instance Link bei Azure SQL Managed Instance. Daneben führt die Migrationsdokumentation Azure Functions mit Azure-SQL-Triggern für anwendungsspezifische Synchronisation sowie Mirroring in Microsoft Fabric für Analyseumgebungen auf. Welche Variante passt, hängt unter anderem von Quell- und Zielplattform, Datenrichtung, Topologie, zulässiger Verzögerung und Durchsatz ab. Die Migrationsdokumentation enthält dazu eine Übersichtstabelle, die alle Pfade nach Quell- und Zielplattform aufschlüsselt.

Nach erfolgreicher Validierung der Ersatzlösung in einer Nicht-Produktivumgebung empfiehlt Microsoft, die automatische Synchronisierung der bisherigen Gruppe vorübergehend abzuschalten. Erst wenn Anwendungen nicht mehr auf SQL Data Sync angewiesen sind, sollten Unternehmen die alten Ressourcen entfernen. Spätestens zum 30. September 2027 muss der Umstieg abgeschlossen sein.


(fo)



Source link

Weiterlesen

Entwicklung & Code

Neu in .NET 10.0 [40]: JSON Patch zum reinen Testen von Werten


Um Werte zu testen, ohne etwas zu ändern, lässt sich in .NET 10.0 JSON Patch verwenden.

Weiterlesen nach der Anzeige


Der Dotnet-Doktor – Holger Schwichtenberg

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Das folgende Beispiel zeigt die Anwendung der neuen Klasse JsonPatchDocument aus System.Text.Json Version 10.0 auf ein JSON-Patch-Dokument, dass nur aus Test-Operationen besteht:


CUI.H2("Testen mit JSON Patch-Dokument");
string jsonPatchTest = """
[
    { "op": "test", "path": "/FirstName", "value": "Dr. Holger" },
{ "op": "test", "path": "/PrivateEmail", "value": null},
    { "op": "test", "path": "/PrivateWebsite", "value": null},
    { "op": "test", "path": "/Address/ZipCode", "value": "45257" }
]
""";
 
// JSON Patch-Dokument laden
JsonPatchDocument? patchTestDoc = JsonSerializer.Deserialize>(jsonPatchTest);
 
// JSON Patch-Dokument anwenden auf das Person-Objekt
patchTestDoc!.ApplyTo(person, patchError => CUI.PrintError(patchError.ErrorMessage));


In diesem Fall gibt es keine Fehlerausgabe. Wenn man das JSON-Patch-Dokument aber verändert


CUI.H2("Reines Testen eines Objekts mit JSON Patch-Dokument (absichtlich mit drei Fehlern!)");
string jsonPatchTest = """
[
    { "op": "test", "path": "/FirstName", "value": "Dr.Holger" },
    { "op": "test", "path": "/PrivateEmail", "value": null},
    { "op": "test", "path": "/PrivateWebsite", "value": ""},
    { "op": "test", "path": "/Address/ZipCode", "value": "45251" }
]
""";


bekommt man drei Fehlermeldungen:


Screenshot

Screenshot

Drei Fehler zeigt die Ausgabe (Abb. 1).

Dabei ist die Fehlermeldung bei 'PrivateWebsite' ungünstig, denn sie unterscheidet nicht zwischen Leerstring und Null. Im Objekt steht null, getestet wird auf Leerstring. In der Fehlermeldung steht jedoch in beiden Fällen ' '.

Weiterlesen nach der Anzeige


(rme)



Source link

Weiterlesen

Beliebt