Laden...

Klassen Properties verschwinden, Debug zeigt sie aber an.

Erstellt von Glowhollow vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.071 Views
Thema geschlossen
G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren
Klassen Properties verschwinden, Debug zeigt sie aber an.

Hallo,

ich hab ein komisches Phänomen. Ich arbeite ja noch mit nem eigene JSON-Parser, die Deserialisierung habe ich im Netz gefunden. Teste ich das mit kleineren Daten, behält er die übergebenen Properties und speichert diese. Jedoch, beim debuggen, in der neueren Version befüllt der Deserialisierer die Properties, sobald ich jedoch in die nächste Zeile gehe (wo ich eigentlich nur den Inhalt ausgeben will, bekomme ich eine Null referenz).

Meine Vermutung liegt, das irgendwas mit dem eigenen Getter und Setter falsch läuft, weiß jedoch nicht warum.

Hier der Code.


public class JSONObjects
{
 public List<JSONObjectsvalues> result { get; set; }
}

[Serializable]
public class JSONObjectsvalues
{
 ...
 private ResolvedBy myVar1;
 public ResolvedBy resolved_by
 {
  get
   {
     if (myVar1 == null)
      {
       myVar1 = new ResolvedBy();
       return myVar1;
      }
      if (String.IsNullOrWhiteSpace(myVar1.link) && String.IsNullOrWhiteSpace(myVar1.value))
      {
       myVar1 = new ResolvedBy();
       return myVar1;
      }
      return myVar1;
     }
      set { myVar1 = value; }
    }
}


JSONObjectsvalues sourcecontents = new JSONObjectsvalues();

var content = readStringAndSplitInSections(tempString, startposition, context);
if (!endOfJSON)
{
var preparation= "{"+content+"}";

sourcecontents = preparation.FromJson<JSONObjectsvalues>();
var tmp = sourcecontents.resolved_by.link;
}

Interessanterweise wird resolved_by sobald ich den debug punkt auf sourcecontents habe, auch richtig befüllt, die daten sind da, die da reingehören.

Sobald ich jedoch mit dem Debugger einen step weiter gehe (1 zeile runter), sind die Werte nicht mehr befüllt.

Die variable tmp zeigt dadurch auf null.

Warum ?

Edit: Der Grund für die Abfrage, nach null bzw. leerstring ist nur deswegen der fall, weil ich hier das problem habe, das resolved_by statt link und value auch nur mal einen leerstring enthalten kann. Daher die Abfrage im Getter und Setter.

P.S. Der Deserialisierer funktioniert, vermute wiegesasgt, das das problem beim getter und setter liegt.

16.807 Beiträge seit 2008
vor 5 Jahren

Das löst man in NewtonSoft Json mit Hilfe des JToken.
Siehe Wie eine List aus Objekten erstellen ?

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Lieber Abt, es ist schön, das das Newtonsoft mit dem JToken kann.

Das ist etwa so, als wenn ich fragen würde, warum fährt mein auto nicht und ich als antwort bekomme, das die anderen autos beim autohändler aber fahren können.

Das ist nicht die Lösung dieses Phänomens.

Wenn natürlich der JToken (was auch immer das sein mag), in dem Fall, das vergessen, der Properties löst, höre ich mir dazu gerne deinen Vortrag dazu an.

Im Anhang sieht man den Debugger-Output

Warum ist also der Inhalt, nach einer Zeile weiter im Code weg und zeigt auf null ?

16.807 Beiträge seit 2008
vor 5 Jahren

Das Grundproblem - wie im anderen Thread bereits genannt - ist, dass Du irgendwas hinfrickelst, für das es etablierte Lösungen gibt.
Das hier wird so enden, wie so ein Fall i.d.R. endet: Du erfindest gerade das Rad neu, stolperst von einem Issue in das nächste und kümmerst Dich nun um einen Software-Teil, der nicht zu den Kernkompetenzen eurer Lösung gehört.

Du hast Dich mit Json nicht ordentlich beschäftigt, was jedoch Deine Pflicht ist.

Wann etwas null ist bzw. wird, das kann man alles im Debugger sehen - spätestens mit IntelliTrace oder eigenem Output.

Ich bezweifle auch, dass es dieses Phänomen gibt.
Es wird (vermutlich) einfach ein Problem mit Deinem Code sein. Im Code liegt meistens die Wahrheit.

Allein wenn man sowas hier sieht

if (myVar1 == null)
      {
       myVar1 = new ResolvedBy();
       return myVar1;
      }
      if (String.IsNullOrWhiteSpace(myVar1.link) && String.IsNullOrWhiteSpace(myVar1.value))
      {
       myVar1 = new ResolvedBy();
       return myVar1;
      }
      return myVar1;
     }

schlägt doch jeder Alarm bzgl. Wert- und Referenztypen an.
Werttypen und Referenztypen

Aber ich enthalte mich jetzt, wie gewünscht, Deinen Themen.
Manchmal muss man die Leute auch Fehler machen lassen, dass sie lernen 😃

T
2.219 Beiträge seit 2008
vor 5 Jahren

Anhand deines Code Snippets würde ich sagen, liegt es daran, dass tmp aus seinem Gültigkeitsbereich verschwindet und deshalb an der Stelle auch korrekt auf null zeigt.
Gehört aber zu den Grundlagen von C# und anderen Programmiersprachen, die Gültigkeitsbereiche nutzen.

Nachtrag:
Abt war schneller.
Im groben und Ganzen stimme ich Abt auch zu.
Du könntest dir einiges an Zeit sparen, einfach auf Newtonsofts JSON Parser umzusteigen.
Wenn du dir dort auch die Doku anschaust, mit JToken hat dir Abt auch schon im anderen Thread das Schlagwort geliefert, kannst du das mit etwas Code lösen.
Aktuell setzt du auf irgendeinen Code aus dem Netz und bastelst du irgendwas zusammen und andere sollen ohne zu wissen, was du dort verwendest, deine Fehler suchen.

So wirst du auf lange Sicht auch keine große Unterstützung im Forum bekommen, wenn du gute Ratschläge ignorierst und lieber eigene Lösungen bastelst.
Und anhand des aktuellen Codes kann nieman außer dir wirklich was mit dem Code anfangen oder dir explizite Gründe für Fehlverhalten oder Probleme nennen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

ok, danke für eure ratschläge. Wiegesagt, die etablierte version ist leider nicht anwendbar.

Aber ich habe herausgefunden woran es lag.

Ich hatte einen Funktionsaufruf von FromJSON etwas weiter oben im code, was dazu führte, das er diesen speziellen teil deserialisert hat, aber durch den 2. aufruf, obiges überschrieben hat.

Jetzt noch eine kleine Merge funktion bauen, die werte nach und nach eintrudeln lassen und am ende eine lösung haben.

vielen dank

16.807 Beiträge seit 2008
vor 5 Jahren

Warum Du in einem Forum nach Ratschlägen suchst, wenn Du diese sowieso alle abwehrst und am Ende alles selbst besser weißt und die Welt neu erfinden willst; das bleibt Dein persönliches Geheimnis. 🤔

Wiegesagt, die etablierte version ist leider nicht anwendbar.

Leider kann ich das so nicht stehen lassen; denn das ist - deutlich gesagt - gelogener Bullshit.

Das Problem ist nicht die Anwendbarkeit, denn die ist gegeben und ich hab Dir auch erklärt wie das funktioniert (es ist ein Standard Json Fall), sondern einzig und allein Deine Beratungsresistenz.

Und mit dieser Haltung wirst Du auf immer und ewig schlechten, gammligen Code schreiben.
Auch Dein Code in Copy Funktion verfeinern. gammelt von vorn bist hinten - Du schreibst wieder eine Framework Methode nach; die sogar fehlerhaft implementiert ist - schreibst aber "Viel Spaß mit dem Code".
Ich hoffe, dass niemand diesen Code je benutzt.
Mir tut wirklich jeder leid, der Deinen Code reparieren muss.

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Abt, nochmal, glaubst du wirklich ich würde mich über 1 Woche damit beschäftigen den newtonSoft JSON Deserialiser in unsere Software einzubauen.

Nochmal, das geht nicht, das ist auch unseren Chefprogrammierer auch nicht gelungen. Unsere Software ist damit einfach inkompatibel.

Frag mich nicht warum das so ist, ich habe flowster nicht entwickelt. Bedank dich da bei den Rumänen, die dafür verantwortlich sind. Ich bin nur vom deutschsprachigen Team.

Wir können diese Diskussion gerne weiter ausführen wenn du willst. Leider darf ich dir unsere Software nicht zukommen lassen und es gibt auch keine Testversion, sonst könntest du da das gerne selber ausprobieren.

Und zum Thema Beratungsresistenz. Ich bin nicht beratungsresistent, möchte aber jedoch mich weiterentwickeln, dazu gehört auch erst mal gammeligen Code zu schreiben.

Ich könnte jetzt natürlich auch 6-8 Semester studieren, bevor ich überhaupt eine Zeile Code geschrieben habe.

Aber ich vergesse ja, das ihr sowas natürlich noch nie hattet, und schon als Programmierer auf die Welt gekommen seid.

Tut mir leid, diese Argumentationskette kann ich so nicht stehen lassen.

2.207 Beiträge seit 2011
vor 5 Jahren

Hallo Glowhollow,

du wurdest im anderen Thread Wie eine List aus Objekten erstellen ? schon darauf hingewiesen, dass es keine Rolle spielt, wo die Entwickler herkommen und dass Firmenprobleme die Lösung deines Problems keinesfalls beinflussen. Du hast ein Problem, dir wurde die Lösung mehrfach genannt. Jede Nationalität und firmeninterne Probleme haben damit nichts zu tun.

Gruss

Coffeebean

16.807 Beiträge seit 2008
vor 5 Jahren

Bedank dich da bei den Rumänen, die dafür verantwortlich sind. Ich bin nur vom deutschsprachigen Team.

Das Thema grenzt mir zu sehr an eine Aussage, die rassistisch aufgesfasst werden kann.
Das akzeptieren wir hier nicht. Daher ist hier in Teamabsprache dicht. Fasse dies als persönliche Verwarnung auf.

Thema geschlossen