Programmeinstellungen vor dem Entladen speichern

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

    Neu

    kafffee schrieb:

    Verzeih mir wenn ich mich täusche aber die Property ist doch Public?
    Nur die Variable zum Zwischenspeichern ist Private...


    Tatsache! Wer lesen kann, ist natürlich klar im Vorteil. Wegen der Einrückung im Post musste ich gerade aber auch noch ein zweites Mal schauen.
    Aber es stimmt auch, dass es eine Indexed-Property ist. VB ist mir nicht ganz geläufig und die Syntax ist (für mich) auch weniger verständlich als C#. Aber das wird schwer, das zu serialisieren.
    Am sinnigsten wäre es denke ich, wenn du deine _EqualiserLeft Property nochmal in eine eigene Eigenschaft lädst und mit deinem Indexer separat drauf zugreifst, oder deine Property direkt zu einem Array umänderst und dann direkt darauf zugreifst.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Neu

    Okay, also auf der Website von Newtonsoft heisst es:

    IEnumerable, Lists, and Arrays.NET lists (types that inherit from IEnumerable) and .NET arrays are converted to JSON arrays. Because JSON arrays only support a range of values and not properties, any additional properties and fields declared on .NET collections are not serialized. In situations where a type implements IEnumerable but a JSON array is not wanted, then the JsonObjectAttribute can be placed on the type to force it to be serialized as a JSON object instead.

    So wie ich das verstehe ist es wohl eingeschränkt möglich, aber ich kann mich auch täuschen:
    "any additional properties and fields declared on .NET collections are not serialized"

    Versteht jemand den englischen Text richtig? Was meinen die mit "additional"?

    siycah schrieb:

    Am sinnigsten wäre es denke ich, wenn du deine _EqualiserLeft Property nochmal in eine eigene Eigenschaft lädst und mit deinem Indexer separat drauf zugreifst, oder deine Property direkt zu einem Array umänderst und dann direkt darauf zugreifst.


    Kannst du mir vielleicht an einem kleinen Beispiel zeigen, wie du das meinst, ich verstehe es nicht ganz...

    Neu

    Die meinen glaub eine Auflistung, die noch mehr tut als nur auflisten.
    Kommt nur sehr selten vor.
    ZB IGrouping(Of T) ist eine Auflistung, die zusätzlich noch ein Key-Feld transportiert.
    ich verstehe den Satz so, dass der Serializer diesen Key nicht serialisiert.
    in anderen Worten: Für deinen Anwendungsfall nicht relevant.

    Neu

    Habe auch noch Folgendes gefunden:

    Public and non-public fields
    Newtonsoft.Json can serialize and deserialize fields as well as properties.

    In System.Text.Json, use the JsonSerializerOptions.IncludeFields global setting or the [JsonInclude] attribute to include public fields when serializing or deserializing. For an example, see Include fields.

    Das war hier:
    learn.microsoft.com/en-us/dotn…lic-and-non-public-fields

    Was meinen die mit "Fields"?

    So wie @ErfinderDesRades meint?

    Neu

    kafffee schrieb:


    IEnumerable, Lists, and Arrays.NET lists (types that inherit from IEnumerable) and .NET arrays are converted to JSON arrays. Because JSON arrays only support a range of values and not properties, any additional properties and fields declared on .NET collections are not serialized. In situations where a type implements IEnumerable but a JSON array is not wanted, then the JsonObjectAttribute can be placed on the type to force it to be serialized as a JSON object instead.

    So wie ich das verstehe ist es wohl eingeschränkt möglich, aber ich kann mich auch täuschen:
    "any additional properties and fields declared on .NET collections are not serialized"


    Muttersprachler eilt zur Hilfe!

    Da steht, dass Objekte, basierend auf IEnumerable<T>, List<T> und Arrays zu JSON Arrays serialisiert werden; was man schließlich auch erwartet.

    C#-Quellcode

    1. void SerialiseObjects() {
    2. var ex1 = new List<string> { "Element 1", "Element 2", "Element 3" };
    3. var ex2 = ex1.Select(x => $"${x}.ienumerable");
    4. var ex3 = new string[] { "Element Arr1", "Element Arr2", "Element Arr3" };
    5. var json1 = JsonConvert.SerializeObject(ex1);
    6. var json2 = JsonConvert.SerializeObject(ex2);
    7. var json3 = JsonConvert.SerializeObject(ex3);
    8. }


    Der Output wäre:

    Quellcode

    1. json1: [ "Element 1", "Element 2", "Element 3" ]
    2. json2: [ "Element 1.ienumerable", "Element 2.ienumerable", "Element 3.ienumerable" ]
    3. json3: [ "Element Arr1", "Element Arr2", "Element Arr3" ]


    Klar, ein Beispiel zu meinem Vorschlag kann ich dir auch geben. Aber in C# :D

    C#-Quellcode

    1. class MySettings {
    2. public short[] EqualizerLeft { get; set; } = { 0, 1, 2, 3 };
    3. public short this[int idx] {
    4. get => EqualizerLeft[idx];
    5. set {
    6. if (idx > short.MaxValue) { throw new IndexOutOfRangeException("zu groß!"); }
    7. else if (idx < short.MinValue) { throw new IndexOutOfRangeException("zu klein!"); }
    8. EqualizerLeft[idx] = (short)value;
    9. }
    10. }
    11. internal override string ToString() => JsonConvert.SerializeObject(this);
    12. }
    13. // Verwendung
    14. class User {
    15. void Foo() {
    16. var settings = new Settings();
    17. short myValue = settings[2];
    18. // myValue hat nun den Wert 2
    19. }
    20. }


    Das JSON dazu wäre:

    Quellcode

    1. {
    2. "EqualizerLeft": [ 0, 1, 2, 3 ]
    3. }
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)