JsonSerializer SerializeToUtf8Bytes / Deserialize

  • C#
  • .NET 5–6

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    JsonSerializer SerializeToUtf8Bytes / Deserialize

    Hallo Communit

    Ich versteh jetzt nicht ganz, was die Fehlermeldung bei der Deserialisierung in Zeile 3 aussagen soll?

    Hab die Seite hier schon durchgelesen und auch schon anders ausprobiert, die Fehlermeldung bleibt aber immer bestehen.
    learn.microsoft.com/en-us/dotn…/how-to?pivots=dotnet-6-0

    Danke für die HIlfe.

    Freundliche Grüsse

    exc-jdbi

    Quellcode

    1. System.InvalidOperationException: "Each parameter in the deserialization constructor on type 'exc.jdbi.AppClient.PackMsg' must bind to an object property or field on deserialization. Each parameter name must match with a property or field on the object. The match can be case-insensitive."


    C#-Quellcode

    1. var mp = new PackMsg("myname", "Mytext");
    2. var bytes = JSerialize.SerializeJson(mp);
    3. var newmp = JSerialize.DeserializeJson<PackMsg>(bytes);

    C#-Quellcode

    1. [JsonSerializable(typeof(PackMsg))]
    2. internal class PackMsg
    3. {
    4. public byte[] Id { get; set; } = Array.Empty<byte>();
    5. public byte[] Name { get; set; } = Array.Empty<byte>();
    6. public byte[] Message { get; set; } = Array.Empty<byte>();
    7. public PackMsg(string name, string msg)
    8. {
    9. this.Id = Guid.NewGuid().ToByteArray();
    10. this.Name = Encoding.UTF8.GetBytes(name);
    11. this.Message = Encoding.UTF8.GetBytes(msg);
    12. }
    13. }
    14. internal class JSerialize
    15. {
    16. public static byte[] SerializeJson<T>(T src)
    17. {
    18. var options = new JsonSerializerOptions
    19. {
    20. IgnoreReadOnlyProperties = true,
    21. WriteIndented = true
    22. };
    23. return JsonSerializer.SerializeToUtf8Bytes(src, options);
    24. }
    25. public static T? DeserializeJson<T>(byte[] src)
    26. {
    27. var options = new JsonSerializerOptions
    28. {
    29. IgnoreReadOnlyProperties = true,
    30. WriteIndented = true
    31. };
    32. return JsonSerializer.Deserialize<T>(src, options);
    33. }
    34. }
    Spekulatius: probier es mal testweise ohne das ID-Feld
    Achso: fehlt beim Deserialisieren nicht die UTF8-Rückumwandlung?
    btw: Kannst Du die JsonSerializerOptions rausziehen, damit Du sie nur einmal innerhalb von JSerialize festlegen musst?
    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.
    Pack einen leeren Constructor rein, keine Ahnung wie MS das meint.(mann könnte meinen, das für jedes Feld ein argument im Konstruktor sein muss, der identisch heißt und vom selben Typ ist, abgesehen von Groß-/Klein-Schrift beim Namen. Das sollte gehen.

    C#-Quellcode

    1. internal class PackMsg
    2. {
    3. public byte[] Id { get; set; } = new byte[] { };
    4. public byte[] Name { get; set; } = new byte[] { };
    5. public byte[] Message { get; set; } = new byte[] { };
    6. public PackMsg() { }
    7. public PackMsg(string name, string msg)
    8. {
    9. this.Id = Guid.NewGuid().ToByteArray();
    10. this.Name = Encoding.UTF8.GetBytes(name);
    11. this.Message = Encoding.UTF8.GetBytes(msg);
    12. }
    13. }
    Laut stackoverflow solltest Du noch einen parameterlosen Konstruktor zur Verfügung stellen.
    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.
    @exc-jdbi

    Das würde auch gehen, selber Typ selber Name, abgesehen von Groß-/Klein-Schrift. Falls du das vorher schon so hattest, lag es am Namen des 2. Argument. Das Feld heißt Message, der Paramater msg, das war ein weiterer Stein im Weg. Aber ich denke der leere Konstruktor ist besser. Weil würdest du nun deinen gezeigten und diesen verwenden, würde es eh wieder auf einen leeren Konstuktor(0 Args) hinauslaufen.

    C#-Quellcode

    1. internal class PackMsg
    2. {
    3. public byte[] Id { get; set; } = new byte[] { };
    4. public byte[] Name { get; set; } = new byte[] { };
    5. public byte[] Message { get; set; } = new byte[] { };
    6. public PackMsg(byte[] name, byte[] message)
    7. {
    8. this.Id = Guid.NewGuid().ToByteArray();
    9. this.Name = name;
    10. this.Message = message;
    11. }
    12. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    @BitBrösel

    Ich müsste es ausprobieren.

    Ich hab noch viele weitere Members drin, die auch mit serialisiert werden müssen.

    Ich denke den ersten Vorschlag von dir ist der Beste, weil das hier z.B. in Zeile 11 nicht als "leerer" Konstruktor gilt, und ich habe genau diesen Fall.

    C#-Quellcode

    1. [JsonSerializable(typeof(PackMsg))]
    2. internal class PackMsg
    3. {
    4. public byte[] Id { get; set; } = Array.Empty<byte>();
    5. public byte[] Name { get; set; } = Array.Empty<byte>();
    6. public byte[] Message { get; set; } = Array.Empty<byte>();
    7. public byte[] IpAddress { get; set; } = Array.Empty<byte>();
    8. public PackMsg() { }
    9. public PackMsg(bool setipinternal = false):this()
    10. {
    11. if(setipinternal)
    12. this.IpAddress = [NameSpace].ToInternalIpAddress();
    13. }
    14. public PackMsg(string name, string msg)
    15. {
    16. this.IpAddress = Array.Empty<byte>();
    17. this.Id = Guid.NewGuid().ToByteArray();
    18. this.Name = Encoding.UTF8.GetBytes(name);
    19. this.Message = Encoding.UTF8.GetBytes(msg);
    20. }
    21. }

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()