Bezeichnung
SetSerializeMode -- stellt den Serialisierungsmodus ein (V10.0)
Übersicht
SetSerializeMode(mode)
Beschreibung
Dieser Befehl setzt den Serialisierungsmodus auf den durch mode angegebenen. Derzeit sind die folgenden Serialisierungsmodi verfügbar: #SERIALIZEMODE_HOLLYWOOD, #SERIALIZEMODE_LIST und #SERIALIZEMODE_NAMED. Wie die einzelnen Serialisierungsmodi interpretiert werden, hängt vom Serialisierer ab.

Der ältere Serialisierer von Hollywood, der in ein proprietäres Format serialisiert, unterstützt nur #SERIALIZEMODE_HOLLYWOOD. Der JSON-Serialisierer von Hollywood unterstützt alle drei Serialisierungsmodi, die er folgendermaßen interpretiert:

#SERIALIZEMODE_HOLLYWOOD:
Dies ist der standardmäßige Serialisierungsmodus. Alle JSON-Elemente werden in Tabellenfelder serialisiert. Darüber hinaus kann der Serialisierer von Hollywood auch binäre Daten serialisieren und sogar Hollywood-Funktionen vervollständigen. Hollywood-Funktionen und Binärdaten werden als Base64-Daten serialisiert. Der Hollywood-Serialisierer unterstützt auch Sparse-Arrays, also Tabellen, deren Indizes nicht streng sequentiell sind, sondern Lücken zwischen den einzelnen Indizes aufweisen. Ein Nachteil des Hollywood-Serialisierers besteht darin, dass er manchmal einige spezielle Markierungen in der JSON-Datei verwendet, um Hollywood über die in einem JSON-Element gespeicherten Daten zu informieren, z.B. ob die Daten als Zeichenkette, als Binärdaten oder als Hollywood-Funktion interpretiert werden sollen. Folglich können Sie möglicherweise keine beliebige JSON-Datei mit dem Hollywood-Serialisierungsprogramm deserialisieren, da einige Dinge im JSON möglicherweise falsch als einer der speziellen Marker von Hollywood interpretiert werden. Solange Sie nur vom Hollywood-Serialisierer geschriebene Daten deserialisieren, werden Sie natürlich nie auf Probleme stoßen. Betrachten Sie beispielsweise die folgende Tabelle:

 
t = {foo = "bar", seqarray = {1,2,3,4,5}, sparsearray =
    {1,[2]=2,[4]=3,[6]=4,[8]=5}}

Wenn Sie dies mit dem Hollywood-Serialisierungsprogramm in JSON serialisieren, sieht das Ergebnis so aus:

 
{
   "seqarray": [1,2,3,4,5],
   "sparsearray": {"0": 1, "2": 2, "4": 3, "6": 4, "8": 5},
   "foo": "bar"
}

Sie können sehen, dass Sparse-Arrays mithilfe von benannten JSON-Indizes serialisiert werden. Das wiederum bedeutet, dass bei der Deserialisierung von JSON-Dateien mit dem Hollywood-Serialisierer benannte Elemente, die nur aus Zahlen bestehen, als Sparse-Array-Felder interpretiert werden, weshalb der Hollywood-Serialisierer nicht zur Deserialisierung beliebiger JSON-Dateien verwendet werden kann, sondern sollte nur mit JSONs verwendet werden, die vom Hollywood-Serialisierungsprogramm erstellt wurden.

Ein weiterer Nachteil des Hollywood-Serialisierers besteht darin, dass die Position von Elementen in der JSON-Datei völlig zufällig sein kann, da sie aus Hollywood-Tabellenfeldern serialisiert werden, die keine bestimmte Reihenfolge haben. Wenn Sie möchten, dass die JSON-Elemente eine feste Reihenfolge beibehalten, müssen Sie stattdessen #SERIALIZEMODE_LIST verwenden.

Standardmäßig konvertiert #SERIALIZEMODE_HOLLYWOOD alle JSON-Schlüsselnamen in Kleinbuchstaben. Wenn Sie das nicht möchten, können Sie dies ändern, indem Sie in SetSerializeOptions() den Tag NoLowerCase auf True setzen. Siehe SetSerializeOptions für Details.

#SERIALIZEMODE_NAMED:
Dieser ist wie #SERIALIZEMODE_HOLLYWOOD, außer dass er keine Hollywood-Erweiterungen unterstützt. Das bedeutet, dass Sie nur Zahlen, Zeichenketten und Tabellen serialisieren können, aber keine Binärdaten oder Hollywood-Funktionen. Außerdem legt dieser Serialisierer Tabellen einige Einschränkungen auf, nämlich dass sie entweder Zeichenkettenindizes oder numerische Indizes verwenden müssen, aber nicht beides. Wenn numerische Indizes verwendet werden, müssen diese Indizes auch strikt sequentiell sein, d.h. Tabellenindizes müssen innerhalb eines bestimmten Bereichs [0..n] sequentiell sein. Es dürfen keine Lücken wie im obigen Beispiel vorhanden sein, daher ist es nicht möglich, Sparse-Arrays mit dem genannten Serialisierer zu serialisieren. Der Vorteil von #SERIALIZEMODE_NAMED gegenüber #SERIALIZEMODE_HOLLYWOOD besteht darin, dass Sie damit jede beliebige JSON-Datei ohne Probleme deserialisieren können, da der benannte Serialisierer keine Hollywood-Erweiterungen unterstützt. Dies liegt daran, dass die benannten Serialisierer keine Markierungen verwenden, sodass keine Gefahr von Konflikten zwischen JSON-Daten und Hollywood-Markierungen besteht. Genau wie bei #SERIALIZEMODE_HOLLYWOOD kann die Position von Elementen in der JSON-Datei jedoch völlig zufällig sein, da sie aus Hollywood-Tabellenfeldern serialisiert werden, die keine bestimmte Reihenfolge haben. Wenn Sie möchten, dass die JSON-Elemente eine feste Reihenfolge beibehalten, müssen Sie stattdessen #SERIALIZEMODE_LIST verwenden.

Standardmäßig konvertiert #SERIALIZEMODE_NAMED alle JSON-Schlüsselnamen in Kleinbuchstaben. Wenn Sie das nicht möchten, können Sie dies ändern, indem Sie in SetSerializeOptions() den Tag NoLowerCase auf True setzen. Siehe SetSerializeOptions für Details.

#SERIALIZEMODE_LIST:
Dieser Modus serialisiert JSON-Elemente mithilfe von Listen anstelle von benannten Tabellenfeldern. Das hat den Vorteil, dass die Reihenfolge aller JSON-Elemente erhalten bleibt. Außerdem bleibt die Schreibweise der einzelnen JSON-Schlüssel erhalten und Sie könnten sogar denselben Schlüssel mehrmals verwenden. Ein Nachteil ist, dass der Zugriff auf die JSON-Daten etwas schwieriger ist, da sie in Schlüssel-Wert-Paar-Tabellen gespeichert sind. Betrachten Sie beispielsweise die folgenden JSON-Daten:

 
{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 27,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  }
}

Der Listenserialisierer speichert jeden Schlüsselwert in seiner eigenen Tabelle unter Verwendung von key und value als benannte Tabellenindizes. Um also auf Daten aus dem obigen JSON zuzugreifen, müssten Sie diesen Code verwenden:

 
Print(t[3].key, t[3].value)                   ; "age 27"
Print(t[4].value[2].key, t[4].value[2].value) ; "state NY"

Mit dem Namen- oder Hollywood-Serialisierer können Sie auf die JSON-Daten zugreifen, indem Sie einfach den Schlüsselnamen verwenden:

 
Print(t.age)                   ; prints "27"
Print(t.address.state)         ; prints "NY"

Wie Sie sehen können, führt die Verwendung des Namen- oder Hollywood-Serialisierers zu besser lesbarem Code, aber der Nachteil ist, dass die Elementreihenfolge im JSON nicht beibehalten wird, sodass das JSON möglicherweise schwieriger zu lesen ist.

Beachten Sie, dass bei Verwendung eines externen Serialisierers (z.B. eines Plugins) die Interpretation der verschiedenen Serialisierungsmodi völlig unterschiedlich sein kann. Die obige Dokumentation gilt nur für den integrierten JSON-Serialisierer von Hollywood.

Beachten Sie auch, dass dieser Befehl den Serialisierungsmodus global ändert. Sie können den Serialisierungsmodus auch lokal ändern, indem Sie den Tag Mode in den optionalen Tabellenargumenten von Befehlen wie SerializeTable() setzen. Siehe SerializeTable für Details.

Eingaben
mode
gewünschter Serialisierungsmodus

Navigation zeigen