Ist es für meine Konfigurationsdatei ratsam, etwas anderes als XML zu verwenden?

8

Ich entwerfe ein kleines Tool, für das eine Konfigurationsdatei erforderlich wäre. Die Konfigurationsdatei ist in meinem Fall eigentlich eher eine Datenbank, muss jedoch leichtgewichtig sein, und der Endbenutzer sollte sie bei Bedarf leicht bearbeitbar finden. Es wird jedoch auch viele Dinge enthalten. (Abhängig von bestimmten Faktoren können 1 MB oder mehr sein.)

Ich habe beschlossen, lieber einfachen alten Text zu verwenden, als SQLite oder ähnliches zu verwenden. Bei der Verwendung von Text muss ich mich jedoch auch mit der Vielfalt der Formate auseinandersetzen. Bisher sind meine Optionen

  • XML
  • JSON
  • Benutzerdefiniertes Format

Die Daten in meiner Datei sind recht einfach und bestehen größtenteils aus Dingen vom Typ Schlüsselwert. Ein benutzerdefiniertes Format wäre also nicht so schwierig ... aber ich muss mich lieber nicht darum kümmern, die Unterstützung dafür zu schreiben. Ich habe noch nie gesehen, dass JSON für Konfigurationsdateien verwendet wird. Und XML würde die Dateigröße meiner Meinung nach erheblich aufblähen. (Ich habe auch nur eine Abneigung gegen XML im Allgemeinen).

Was soll ich in diesem Fall tun?

Zu berücksichtigende Faktoren:

  • Diese Konfigurationsdatei kann auf einen Webdienst hochgeladen werden (Größe ist also wichtig).
  • Benutzer müssen in der Lage sein, es bei Bedarf von Hand zu bearbeiten (einfache Bearbeitung und Lesen).
  • Muss in der Lage sein, automatisch zu generieren und zu verarbeiten (Geschwindigkeit spielt keine große Rolle, ist aber nicht übermäßig langsam)
  • Die "Schlüssel" und "Werte" sind einfache Zeichenfolgen, müssen jedoch maskiert werden, da sie alles enthalten können. (Unicode und Escape muss einfach funktionieren)
  • Mehrere Konfigurationsdateien. Grundsätzlich ist jede Konfigurationsdatei an ein "Projekt" gebunden
Earlz
quelle
10
Die Konfiguration in .NET ist ein ausgereifter und gut verstandener Prozess. Warum das Rad neu erfinden?
MattDavey
3
Warum denkst du nicht über YAML nach? Ich denke, YAML passt am besten.
Sawa
1
@sawa eigentlich habe ich noch nie von YAML gehört. Es sieht ziemlich interessant aus
Earlz
5
@Earlz and if needed the end-user should find it easily editable. However, it also will contain a lot of things in it. (depending on certain factors, could be 1Mb or more). Sie können Ihren Kuchen nicht haben und ihn essen. 1 MB-Dateien können per Definition nicht einfach bearbeitet werden. Entweder ist es eine Datenbank (auch wenn sie klein ist), und dann ist SQL-Lite eine gute Option, oder es ist eine Konfigurationsdatei (Sie sollten nicht über 1 MB Konfiguration verfügen).
Pieter B
3
Was ist mit INI-Dateien? Sie sind die häufigste Methode zum Konfigurieren von Anwendungen in Windows- und UNIX-ähnlichen Systemen.
Sakisk

Antworten:

12

Ich denke, YAML passt am besten zu Ihrem Fall. Nach meinem Verständnis ist YAML das De-facto-Standardformat für Konfigurationsdateien, die von Hand bearbeitet werden müssen. Viele Programmiersprachen verfügen über eine Bibliothek zum Lesen und / oder Schreiben von YAML. JSON ist eng mit YAML verwandt, aber etwas weniger einfach zu schreiben als YAML und wird eher für die Kommunikation zwischen dem Webserver und dem Client-Programm verwendet.

sawa
quelle
4
De facto unter wem?
Donal Fellows
6

Wenn Sie JSON verwenden, können Benutzer keine Konfigurationselemente auskommentieren, um verschiedene Dinge auszuprobieren. Für mich ist das ein Deal Breaker.

Dies bedeutet auch, dass Sie keine gut kommentierte Beispielkonfigurationsdatei bereitstellen können, die Benutzer anpassen können.

XML ist Standard und wenn Sie ein Schema bereitstellen können, werden sich Ihre Benutzer bei Ihnen bedanken.

Artbristol
quelle
2
+1 Ich wollte gerade meine schlechten Erfahrungen mit JSON erwähnen. Es ist kein gültiges "Konfigurations" -Format: Keine Kommentare, nicht wirklich lesbar, leicht zu hinterlassende Kommas in Listen, keine Verweise zwischen Konfigurationsobjekten. YAML oder XML sind die wirklichen Optionen.
Jjmontes
5

Nachdem Sie sich Ihre Anforderungen angesehen und festgestellt haben, dass Sie XML nicht mögen, würde ich Ihnen raten, sich für JSON zu entscheiden. Ich muss zugeben, dass ich mich nur mit XML und JSON befasst habe, daher kann ich nicht für andere gängige Konfigurationsformate sprechen.

JSON ist sehr einfach zu schreiben und bei korrekter Formatierung leicht zu lesen. Google LIEBT JSON nur für die Konfiguration in seinen Tools. JavaScript kann es auch nativ in Objekte verwandeln.

QAH
quelle
2

Eine "Eigenschaften" -Datei ist gut für Schlüssel / Wert, da das Format selbst Schlüssel / Wert ist. Es ist einfach 1 Zeile pro Schlüssel / Wert. Das erste = Zeichen in der Zeile teilt den Schlüssel und den Wert.

Es ist kleiner als eine entsprechende XML-Datei, da die einzige Formatierung das Trennzeichen "=" und das Zeilenumbruchzeichen ist. In einer XML-Datei kann das Markup genauso viel Platz beanspruchen wie der Inhalt selbst. Dies könnte buchstäblich den Unterschied zwischen einem Upload von 1 MB und 2 MB bedeuten. Komprimierung hilft, aber Sie sind immer noch vorne, wenn Sie klein anfangen.

Bestehende Bibliotheken können auf Zugriffsdateien zugreifen. Aber es ist so trivial, dass Sie in wenigen Minuten Ihre eigenen erstellen können. Schnickschnack in weniger als einer Stunde.

IP=11.22.33.44
BuildNumber=5.02.004
MaxFrameRate=50
mike30
quelle
2

Einige gute Antworten hier schon. Aber wenn ich in Ihren Schuhen stecken würde, bevor ich XML über Bord werfen würde, würde ich die folgenden Punkte berücksichtigen:

  • XML wird von .NET Framework und Tools von Drittanbietern sehr gut unterstützt. Für JSON müssen Sie eine Bibliothek von Drittanbietern auswählen und prüfen, ob sie alle Ihre Anforderungen erfüllt.

  • Wenn Sie nur in wenigen Ausnahmefällen eine manuelle Bearbeitung benötigen, leidet XML wahrscheinlich unter Ihren Anforderungen. Wenn viel bearbeitet werden muss und Ihre Liste der Konfigurationsoptionen eine besondere Komplexität aufweist, benötigen Ihre Benutzer höchstwahrscheinlich eine Art dialogbasierte Option / Konfigurationsanwendung. Dies bedeutet, dass es keine Rolle spielt, ob das zugrunde liegende XML-Format 100 ist % benutzerfreundlich. Wenn Sie so etwas nicht schreiben möchten, können Sie Ihren Benutzern zumindest eine Art XML-Editor empfehlen. Tools wie XML Notepad oder die XML-Tools für Notepad ++ eignen sich gut für viele Benutzer.

  • Ich denke, die Chancen sind höher, dass Ihre Endbenutzer zuvor eine Art XML gesehen haben, als die Chancen, dass sie JSON schon einmal gesehen haben - was es für sie ein bisschen einfacher macht, es zu verstehen (wenn sie es wirklich müssen).

  • JSON unterstützt keine Kommentare, was die manuelle Bearbeitung zu einem Problem machen kann

  • Wenn die Größe beim Hochladen der Daten zu einem Webdienst wirklich ein Problem darstellt, sollten Sie die Datenkomprimierung in Betracht ziehen

Wenn Sie über diese Punkte nachdenken und XML ohnehin nicht verwenden möchten, wählen Sie stattdessen JSON. Die Verwendung von XML oder JSON bietet Ihnen bereits Standardmethoden zum Ausweichen von Zeichenfolgen, Standardmethoden zum späteren Erweitern Ihrer Konfigurationsstruktur und vorgefertigte Bibliotheken zum Lesen und Schreiben dieser Formate. Sie müssen das Rad nicht mit einem "benutzerdefinierten Format" neu erfinden.

Doc Brown
quelle
Das große Problem, das ich mit XML habe, ist, dass es sehr ausführlich ist. Wenn ich 2000 Zeichenfolgen mit einer Größe von 20 Zeichen habe, sind das 40000 Byte oder 40 KB. Fügen Sie nun XML hinzu, und der Overhead von XML-Tags über alles hinweg kann sich wirklich summieren. <MyString>und </MyString>addiert bis zu 21 weitere Zeichen pro Zeichenfolge. Dies ist das Problem, das ich mit XML in diesem speziellen Szenario habe, in dem die Größe eine Rolle spielt, aber nicht so wichtig ist, wenn Binärdateien oder
ähnliches
1
@Earlz: Wie ich oben geschrieben habe, wenn die Größe wirklich wichtig ist, warum nicht die Datenkomprimierung versuchen (zum Beispiel mit icsharpcode.net/OpenSource/SharpZipLib/Default.aspx )? Und ehrlich gesagt, sind Sie sich absolut sicher, dass es in Ihrem Szenario wichtig ist, ob die Dateien 40 KB oder 80 KB haben?
Doc Brown
1

Was die Konfigurationsdateien angeht, ist "1 MB oder mehr" sicherlich eine große Sache, und die Notwendigkeit, Zeichenfolgen zu entkommen und viele übereinstimmende Anführungszeichen beizubehalten, spielt beim Menschen keine gute Rolle. Aus diesem Grund sollten Sie bei großen Konfigurationsdateien, die von Menschen verwaltet werden müssen, auf jeden Fall in Betracht ziehen, ein benutzerdefiniertes Format zu definieren und einen benutzerdefinierten Parser zu erstellen. Hier ist ein Artikel zum Thema Menschen, die XML schreiben müssen: Menschen sollten XML nicht bearbeiten müssen .

Wenn Parser und Parser-Generatoren noch in den Kinderschuhen steckten, könnten Sie dafür eintreten, keine benutzerdefinierte Sprache zu erstellen, indem Sie sagen, dass das Erstellen einer benutzerdefinierten Sprache zu komplex ist. Nachdem die hervorragenden und sehr einfachen Parser-Generatoren ausgereift sind, gibt es keine Entschuldigung: Sie können in wenigen Stunden einen benutzerdefinierten Parser erstellen, der der Zeit entspricht, die Sie zum Erstellen eines Parsers für eine XML-basierte Sprache benötigen würden * .

In diesem kleinen Tutorial wird der Prozess zum Erstellen eines benutzerdefinierten Parsers mit ANTLR erläutert . Es ist in Java, aber ANTLR unterstützt auch C #.


* Wenn Sie sich nicht für eine auf Deserialisierung basierende Konvertierung von XML entscheiden, würde das Erstellen eines XML-basierten Parsers weniger Zeit in Anspruch nehmen, aber Ihre Klassen müssten eine "Form" haben, die Ihrer XML sehr ähnlich ist.

dasblinkenlight
quelle
0

JSON ist eine gute Wahl für seine Flexibilität, einfache Lesbarkeit und Bearbeitung außerhalb Ihres Programms sowie die breite Verfügbarkeit von Analysebibliotheken, um es zu unterstützen. Es unterstützt Hierarchien und eignet sich für eine einfache Vorwärts- / Rückwärtskompatibilität, die eine Datei, die Daten einfach nacheinander speichert, nicht bietet. Ich denke, es hat auch einfache Techniken zum Konvertieren zwischen Java-Klassen und Dateidaten und dann zurück in die andere Richtung. Viele Leute kennen und haben dieses Format codiert, und das Format ist wichtig für andere Programme, mit denen Sie wahrscheinlich in Zukunft arbeiten müssen.

Viele Systeme basierten auf dem INI-Format und sind ziemlich einfach zu analysieren, wenn Sie einen Parser von Grund auf neu schreiben.

csv lässt sich schnell codieren und arbeitet mit sehr geringem Overhead, hat jedoch Probleme mit der Flexibilität und der Vorwärts- / Rückwärtskompatibilität.

Die Verwendung der Registrierung war unter Windows üblich.

Die Verwendung von Cookies ist bei der Webentwicklung üblich.

Verwenden Sie für eine Dienstprogrammfunktion möglicherweise nur Text im freien Format, der Ihren Befehlszeilenoptionen entspricht, lesen Sie ihn einfach ein und erstellen Sie daraus ein argv-String-Array.

DeveloperDon
quelle
0

Verwenden Sie kein XML.

XML ist eine Auszeichnungssprache. Bei der Verwendung für die Serialisierungs- oder Konfigurationssprache hat XML ein grundlegendes Problem, nämlich dass Attribute und Textinhalte eines Elements dasselbe beschreiben können. Sie müssen sich zwischen Attributen und Textinhalten entscheiden. Darüber hinaus ist XML unnötig ausführlich und muss beispielsweise den Elementnamen zweimal angeben (öffnen, schließen).

Verwenden Sie XML für das, was es bedeutet: als Auszeichnungssprache. Konfigurationsdateien erfordern keine Auszeichnungssprache.

Verwenden Sie auch kein JSON.

JSON ist wunderbar als Datenserialisierungsformat. JSON fehlt jedoch ein Kommentar. Das ist für mich ein Deal Breaker. Außerdem müssen Sie allen Vorkommen des "Charakters entkommen .

Verwenden Sie INI nicht.

INI-Dateien haben ein grundlegendes Problem: Ihnen fehlen verschachtelte Datenstrukturen. Der einzige Begriff der Verschachtelung ist, dass ein Tag eine Reihe von Attributen haben kann. Das ist nur 1 Verschachtelungsebene. In realen Anwendungsfällen habe ich diese Einschränkung als äußerst ärgerlich empfunden. Ich habe als Teil eines Projekts gearbeitet, bei dem die Konfiguration in INI-Dateien war und die Schmerzen groß sind.

Verwenden Sie nach Möglichkeit eine benutzerdefinierte Sprache.

Wenn Sie Zugriff auf Parser-Generator-Tools wie Lex & Yacc haben, verwenden Sie eine benutzerdefinierte Sprache. Ich bin nicht sicher, wie der Status für Parser-Generatoren in .NET ist, aber für C-Code würde ich Lex & Yacc wählen. Die Lernkurve am Anfang mag etwas steil sein (Lex & Yacc sind nicht die am einfachsten zu verwendenden Tools), aber die für das Lernen investierte Zeit ist es absolut wert.

Wenn eine benutzerdefinierte Sprache nicht möglich ist, verwenden Sie YAML.

Y AML, wie der Name schon sagt, ein in't m arkup l anguage. Es ist eine Serialisierungssprache, die aufgrund ihrer für Konfigurationsdateien akzeptablen Eigenschaften zufällig ist, da sie Kommentare unterstützt. YAML ist nicht unnötig ausführlich wie XML: Es ist nicht erforderlich, den Elementnamen zweimal anzugeben (öffnen, schließen). YAML hat nicht das Problem Attribut vs. Textinhalt von XML.

Berücksichtigen Sie auch pro.per.ty = value.

Wenn Sie eine INI-ähnliche Konfiguration wünschen, bei der die Verschachtelung unterstützt wird, ziehen Sie ein Format in Betracht, das aus pro.per.ty=valuePaaren (Schlüssel-Wert-Paaren) besteht, wobei der Schlüssel mehrere verschachtelte Ebenen haben kann, wobei das .Zeichen als Trennzeichen verwendet wird.

juhist
quelle