Wie benutze ich Id/Guid bei Klasseninstanzierung und das selbe KlassenModel als DeserializeObj Model (Problem Readonly)

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    Wie benutze ich Id/Guid bei Klasseninstanzierung und das selbe KlassenModel als DeserializeObj Model (Problem Readonly)

    Hi,

    ich schau mir gerade das Json Format (XML, CSV etc.) als Möglichkeit an, Daten in einem File auf der HD zu speichern. Dazu hab ich folgende Klasse erstellt:

    C#-Quellcode

    1. public class MyJsonDataModel
    2. {
    3. public Guid Id { get; }
    4. public string Name { get; set; }
    5. public MyJsonDataModel(string name)
    6. {
    7. Name = name;
    8. Id = Guid.NewGuid();
    9. }
    10. }


    und noch kurz als VB.net

    VB.NET-Quellcode

    1. Public Class MyJsonDataModel
    2. Public ReadOnly Property Id As Guid
    3. Public Property Name As String
    4. Public Sub New(ByVal name As String)
    5. Name = name
    6. Id = Guid.NewGuid()
    7. End Sub
    8. End Class


    Mit hilfe der Libray Newtonsoft.Json kann ich dann über das DatenModel der Klasse in Json Format serializieren/deserializieren. Ich erzeuge ein Obj. der Klasse in dem ich nur den "Namen" übergebe das Obj. erzeugt dann auto. eine Guid ID. Ich speichere alles erfolgreich ab und kontrolliere im File -> i.O..

    Jetzt das Problem:

    Wenn ich mit dem gleichen DatenModel das File wieder zurücklesen wil,l kommt das Problem, dass die Guid ja readonly ist. Und der DeserilizeProzess das Property nicht schreiben kann.
    Folge ist, dass beim laden immer "einfach" eine neue Guid ID generiert wird und diese dann in der Form1 angezeigt wird.

    Sie entspricht nicht der gespeicherten Guid auf dem File, der Name wird erfolgreich eingelesen.

    Ich würde das Readonly der Guid eigentlich gerne behalten, wie setze ich das um? Mir fehlt leider die Erfahrung... LG nogood
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nogood“ ()

    Der JSON-(De)Serializer kann doch im Konstruktor so konfiguriert werden, dass er auch ReadOnly-Properties verarbeitet. Bin ich mir zumindest zu 98 % sicher.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Okay ich mach mich auf die Suche :)

    ----
    [Solved]

    C#-Quellcode

    1. public class MyJsonDataModel
    2. {
    3. [JsonProperty]
    4. public Guid Id { get; private set; }
    5. public string Name { get; set; }
    6. public MyJsonDataModel(string name)
    7. {
    8. Name = name;
    9. Id = Guid.NewGuid();
    10. }
    11. }


    Verstanden hab ich das noch nicht, aber es scheint die Funkionalität zu haben die ich wollte.
    Also man muss den setter als privat deklarieren und nicht einfach weglassen und dazu noch das Attribut [JSonProperty] setzen. Gefunden auf Stackoverflow.
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nogood“ ()