Wie überspringe ich die standardmäßige JavaScript-Array-Serialisierung für IEnumerable-Typen in Json.Net?

Einige benutzerdefinierte Typen, die IEnumerable implementieren, verfügen nicht unbedingt über Sicherungssammlungen. Sie könnten dynamisch generiert werden, zum Beispiel mit 'yield' oder LINQ. Hier ist ein Beispiel:

public class SOJsonExample
{
    public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>>
    {
        public List<int> Keys { get; set; }
        public List<float> Values { get; set; }

        public MyCustomEnumerable()
        {
            Keys = new List<int> { 1, 2, 3 };
            Values = new List<float> { 0.1f, 0.2f, 0.3f };
        }

        public IEnumerator<KeyValuePair<int, float>> GetEnumerator()
        {
            var kvps =
                from key in Keys
                from value in Values
                select new KeyValuePair<int, float>(key, value);

            return kvps.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
    }
}

Ich habe festgestellt, dass die Standard-Serialisierung von Json.NET darin besteht, jeden Wert aufzulisten und die Werte in einem JavaScript-Array zu speichern (was ich nicht möchte). Das Standard-Deserialisierungsprogramm deserialisiert die Sammlung dann nicht, da sie nicht gefüllt werden kann. In diesen Fällen möchte ich stattdessen, dass Json.NET die standardmäßige JavaScript-Array-Serialisierung überspringt und nur die Mitglieder der Klasse speichert.

Alles, was ich möchte, sind meine Schlüssel und Werte. Gibt es eine Möglichkeit, dies zu tun, oder muss ich meinen eigenen benutzerdefinierten Serializer implementieren?

Geprüftdiese unddiese, beides ist nicht genau meine Frage. Gescanntdie Dokumentation auch, habe aber nicht gefunden, wonach ich gesucht habe (vielleicht habe ich an der falschen Stelle gesucht).

(Edit # 1 - verbesserte Klarheit)

(Edit # 2 - beantwortete meine eigene Frage ... siehe unten)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage