Hallo Besucher, der Thread wurde 7,6k mal aufgerufen und enthält 46 Antworten

letzter Beitrag von Zirias/Excess am

c++ Klasse wegspeichern und danach auch laden

  • Ich habe nochmal drübergelesen und ich glaube, ich habs jetzt kapiert.


    Er will den im Speicher von einem Objekt seiner Klasse belegten Platz speichern? Byte für Byte?


    Da aber gar nichts initialisiert wurde, und strings beliebig groß werden können, weiß er doch gar nicht vorher, wie groß ein solches Objekt dann ist? sizeof() liefert doch nur die Größe des Typs, oder liege ich da falsch?

  • ...Wer heute in C# oder Java programmiert ist natürlich verwöhnt von umfangreichen Frameworks, die solche Dinge schon völlig generisch lösen ... Serializer auswählen, vielleicht bisschen konfigurieren, Datenklasse "reinfüttern" und gut.

    Ich bin ganz frisch mit C# dabei, Datenaustausch, einmal in die Vollen alles neu: SOAP, WCF-Webservice auf IIS gehostet, Klassen aus einer .wsdl-Datei erzeugt...
    "Nur" diese Black Box zu konfigurieren ist das frustrierenste, was mir bisher begegnet ist. Reflection, Attribute und "nur konfigurieren" entziehen sich der Kontrolle durch den Compiler und sind ein sprudelnder Quell erstaunlichster Bugs. Da entfaltet sich schnell eine Komplexität, die der Kernaufgabe einfach nicht mehr angemessen ist.


    Von C++ hab ich noch weniger Ahnung als von C#, und was ein heute üblicher Weg wäre weiß ich auch nicht.
    Ich würde der Klasse eine Methode "Serialize" geben, die entweder einen String zurück gibt oder einen Stream zum Reinschreiben bekommt.
    Und andersrum würde ich einen Methode Deserialize mit gleichen Parametern hinzufügen, oder einen passenden Konstruktor.

  • Ich bin ganz frisch mit C# dabei, Datenaustausch, einmal in die Vollen alles neu: SOAP, WCF-Webservice auf IIS gehostet, Klassen aus einer .wsdl-Datei erzeugt...
    "Nur" diese Black Box zu konfigurieren ist das frustrierenste, was mir bisher begegnet ist. Reflection, Attribute und "nur konfigurieren" entziehen sich der Kontrolle durch den Compiler und sind ein sprudelnder Quell erstaunlichster Bugs. Da entfaltet sich schnell eine Komplexität, die der Kernaufgabe einfach nicht mehr angemessen ist.

    Ui -- also da muss ich einfach mal einen kleinen OT Schwenk machen. .NET ist riesig und durchaus auch schon wieder "alt" -- da wurden nicht immer nur die besten Dinge gemacht. WCF ist heutzutage für Neuentwicklungen eigentlich tot, und zwar weil SOAP tot ist, solche Komplexitätsmonster will keiner mehr. IIS ist auch so ein spezielles Monster, ich würde eher abraten -- self-hosted ist schlanker und wartbarer. Attribute werden in der .NET Welt teilweise noch fleißig verwendet, ich persönlich bin kein Freund davon, weil man sich Abhängigkeiten einhandelt. Schon zu WCF Zeiten habe ich nie die generierten "service references" verwendet, sondern einen schlichten WCF-Proxy mit den originalen Interface-Klassen, schön ausgelagert in eine separate DLL. Wenn ich heute als Architekt in einer ".NET Bude" viel generierten Code oder unnötige Verwendung von Attributen sehe krieg ich n dicken Hals :D Kommt aber selten vor, wir machen nur noch REST, die Service-Seite mit WebAPI, als Client tut's der HttpClient. Serialisieren/Deserialisieren übernimmt hier übrigens Json.NET ;)


    Also kurz gesagt, du liegst mit deinem ersten Feeling IMHO ganz richtig, man kann das alles aber auch besser machen. Natürlich leider nicht, wenn man irgendein bestehendes WCF-Monster warten/weiterentwickeln muss :o

    Ich würde der Klasse eine Methode "Serialize" geben, die entweder einen String zurück gibt oder einen Stream zum Reinschreiben bekommt.
    Und andersrum würde ich einen Methode Deserialize mit gleichen Parametern hinzufügen, oder einen passenden Konstruktor.

    Kann man so machen, wurde selbst in .NET früher so gemacht -- ist auch nicht direkt falsch, aber nicht optimal: Klassen sollten ja immer eine minimale Fachlichkeit kapseln, und Serialisieren/Deserialisieren dürfte so gut wie nie zur fachlichen Funktionalität einer Klasse gehören. Umgekehrt ist es aber in der Regel grundsätzlich zum Persistieren oder Kommunizieren notwendig, also ein klassischer "cross cutting concern". Wenn man das nun in jeder Klasse implementiert ist das streng genommen eine Verletzung des SRP (single responsibility principle). In einer Umgebung wie .NET, in der zur Laufzeit alle dafür nötigen Typinformationen vorhanden sind, ist es daher besser, den Serialisierer komplett isoliert zu bauen; er bekommt lediglich eine Klasse mit public properties (oder eben getter und setter) gefüttert und kann damit "von außen" arbeiten. Typischerweise kann man in so einem Serialisierer eigene Serialisierungsklassen registrieren, falls man das Standardverhalten für bestimmte Klassen verändern will.

  • Das war Fleißschreibarbeit...