Announcement

Collapse
No announcement yet.

Speichern einer Klasse leichtgemacht?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speichern einer Klasse leichtgemacht?

    Moin moin,

    ich habe zur Zeit folgendes Problem:
    Ich möchte eine Klasse bzw. die angelegten Instanzen samt Inhalt speichern.

    Viele Wege führen nach Rom und ich bin auch schon einige gegangen, aber keiner führte ans Ziel.

    Zuerst hatte ich ein Struct und wollte dieses in eine Binärdatei speichern, was sich als nicht funktionabel erwies, da benutze Strings dynamisch sind und die Binärdatei genaue Werte benötigt, was sich nur mittels Char erreichen lässt, was ich aber nicht verwenden möchte.

    Danach habe ich angefangen mir eine eigene Funktion zurecht zubauen, die alle Daten geordnet in ein Ini-File über die TIniFile Komponente schreibt, was auch relativ gut funktioniert, nur ist das ja nicht wirklich im Sinne des Erfinders, denn wahrscheinlich habe ich das Rad neu erfunden, wenn ich mir folgenden Link ansehe:

    http://dotnet-snippets.de/dns/c-obje...en-SID150.aspx

    Hier wird in C# (leider nicht C++, was ich benötige) eine Klasse per XML-File gespeichert und auch wieder ausgelesen - was sich genau nach dem anhört was ich benötige.
    Leider denke ich, das die Komponente Serialize nur für Net. verfügbar ist und das kein Stückchen auf dem BCB laufen wird.

    Was also tun, um Instanzen eine Klasse samt Inhalt einfach und komfortabel abzuspeichern?!?!

    Danke schon mal für alle Vorschläge. ^^
    Greez Pixtar

  • #2
    Tools wie Hibernate, JAXEN u..a sind leider nur für Java bzw. net verfügbar. Visual C++ kennt zumindestens die Serialisierung.
    Neu ist die Ser. mittels der Boost http://www.rrsd.com/boost/
    Was also tun, um Instanzen eine Klasse samt Inhalt einfach und komfortabel abzuspeichern?!?!
    Nimm TXMLDocument und arbeite damit

    http://www.google.de/search?sourceid...+serialisieren
    Christian

    Comment


    • #3
      Hieße also nun konkret, das es keine Lib in C++ gibt, die meine Idee umsetzen kann sondern ich mir die Serialisierung von Boost installieren muss, damit ich ne Klasse speichern kann, ja?

      Ich habe den Builder 6 und aus der Hilfe kann ich nun nicht ganz entnehmen, ob der BCB nun schon die Komponente TXMLDocument besitzt oder ob ich die noch runterladen muss.

      Muss ich TXMLDocument mit meinem Programm noch bekannt machen per using oder include ?
      Wenn ja, wie lautet die Syntax dazu ?

      Greez Pixtar

      Comment


      • #4
        Hieße also nun konkret, das es keine Lib in C++ gibt, die meine Idee umsetzen kann
        Kenne keine die funktioniert.....


        Muss ich TXMLDocument mit meinem Programm noch bekannt machen
        Da gab es eine BPL die über Komponenten hinzufügen eingebunden werden musste. Dann war die Klasse über das Komponentenfenster sichtbar

        Suche mal hier nach TXMLDocument
        Christian

        Comment


        • #5
          Jo, gefunden habe ich die Datei bereits: http://cc.codegear.com/Item/18938

          Jedoch ist in dem Archive keine BPL enthalten sondern eine BPK, was wohl Borland Package heißen soll. ^^ Wenn ich die Datei ausführe und Install drücke erscheinen folgende Fehler:

          [Pascal Fatal Error] Unable to build. License is invalid or has expired.
          [Pascal Fatal Error] pasall.tmp(2): Read error on 'd:\programme\borland\cbuilder6\lib\obj\system.dcu '
          [Linker Fatal Error] Fatal: Unable to open file 'XMLDOCBCB6.OBJ'

          Liegt es vielleicht daran, das ich ne BCB Enterprise habe und keine BCB Prof. ?

          Wenn ich aber per Hand das Package einfügen will, geht es nicht, da es ja keine BPL-Datei besitzt -> Invalide Package File

          Was also tun?! *kopfkratz*

          Ich habe gerade mal die Reiter im BCB durchgeschaltet und unter Internet eine XML-Button gefunden, der auf die TXMLDocument-Komponente verweist, kann es sein das meine Version vllt. doch schon die Komponente besitzt?

          Comment


          • #6
            BPK als Projekt öffen und compilieren?
            Christian

            Comment


            • #7
              Der Compiler sagt: No Errors.
              Das Debug-Fenster unten: Erneut die selben Fehler

              Wohin ich die Dateien entpackt habe ist doch eigentlich egal oder? Hab alle in die /Lib/ entpackt.

              Comment


              • #8
                Ich habe das Ding in einer dclnet100.bpl....Internet-Komponeten
                Christian

                Comment


                • #9
                  Jo, bestens - hab se nun gefunden dclnet60.bpl isses bei mir.
                  Ich mach mich nun mal an die Methoden und guck erstmal ob alles klappt. ^^

                  Meld mich dann mit einem Erfolg oder mit Fragen

                  Comment


                  • #10
                    Mal zum ausprobieren:

                    http://www.hibernate.org/ (Pakte Core und Annotation)

                    http://www.netbeans.org/

                    Ergibt dann

                    Das was mit @ (mit Ausnahme der overwrite) dient zum persistieren und mit

                    session.save(Klasse)

                    wird in die DB geschrieben

                    Code:
                    package userverwaltung;
                    import java.io.Serializable;
                    import java.util.UUID;
                    import javax.persistence.Entity;
                    import javax.persistence.GeneratedValue;
                    import javax.persistence.GenerationType;
                    import javax.persistence.Id;
                    import javax.persistence.OneToOne;
                    import javax.persistence.PrimaryKeyJoinColumn;
                    import org.hibernate.Hibernate;
                    import org.hibernate.annotations.Cascade;
                     
                    @Entity
                    public class User implements Serializable
                    {
                    private Long id;
                    private String guid;
                    private String vorname;
                    private String nachname;
                    private String email;
                    private String psnr;
                    private String username;
                    private String passwort;
                    private boolean admin;
                    private boolean freigaben;
                    private boolean grunddatawrite;
                    private boolean grunddataread;
                    private boolean formwrite;
                    private boolean formread;
                    private boolean textewrite;
                    private boolean texteread;
                    private UserEinstellungen einstellungen;
                    public User()
                        {
                        this.einstellungen=new UserEinstellungen();
                        guid=UUID.randomUUID().toString();
                        }
                    @Id
                    @GeneratedValue(strategy=GenerationType.AUTO)
                    public Long getId()
                        {
                        return id;
                        }
                    public void setId(Long id)
                        {
                        this.id=id;
                        }
                    public String getGuid()
                        {
                        return guid;
                        }
                    public void setGuid(String guid)
                        {
                        this.guid=guid;
                        }
                    public String getEmail()
                        {
                        return email;
                        }
                    public void setEmail(String email)
                        {
                        this.email=email;
                        }
                    public String getNachname()
                        {
                        return nachname;
                        }
                    public void setNachname(String nachname)
                        {
                        this.nachname=nachname;
                        }
                    public String getPasswort()
                        {
                        return passwort;
                        }
                    public void setPasswort(String passwort)
                        {
                        this.passwort=passwort;
                        }
                    public String getPsnr()
                        {
                        return psnr;
                        }
                    public void setPsnr(String psnr)
                        {
                        this.psnr=psnr;
                        }
                    public String getUsername()
                        {
                        return username;
                        }
                    public void setUsername(String username)
                        {
                        this.username=username;
                        }
                    public String getVorname()
                        {
                        return vorname;
                        }
                    public void setVorname(String vorname)
                        {
                        this.vorname=vorname;
                        }
                    public boolean isAdmin()
                        {
                        return admin;
                        }
                    public void setAdmin(boolean admin)
                        {
                        this.admin=admin;
                        }
                    public boolean isFreigaben()
                        {
                        return freigaben;
                        }
                    public void setFreigaben(boolean freigaben)
                        {
                        this.freigaben=freigaben;
                        }
                    public boolean isFormread()
                        {
                        return formread;
                        }
                    public void setFormread(boolean formread)
                        {
                        this.formread=formread;
                        }
                    public boolean isFormwrite()
                        {
                        return formwrite;
                        }
                    public void setFormwrite(boolean formwrite)
                        {
                        this.formwrite=formwrite;
                        }
                    public boolean isGrunddataread()
                        {
                        return grunddataread;
                        }
                    public void setGrunddataread(boolean grunddataread)
                        {
                        this.grunddataread=grunddataread;
                        }
                    public boolean isGrunddatawrite()
                        {
                        return grunddatawrite;
                        }
                    public void setGrunddatawrite(boolean grunddatawrite)
                        {
                        this.grunddatawrite=grunddatawrite;
                        }
                    public boolean isTexteread()
                        {
                        return texteread;
                        }
                    public void setTexteread(boolean texteread)
                        {
                        this.texteread=texteread;
                        }
                    public boolean isTextewrite()
                        {
                        return textewrite;
                        }
                    public void setTextewrite(boolean textewrite)
                        {
                        this.textewrite=textewrite;
                        }
                    @OneToOne
                    @Cascade(
                       {
                       org.hibernate.annotations.CascadeType.SAVE_UPDATE,
                       org.hibernate.annotations.CascadeType.DELETE_ORPHAN
                       })
                    @PrimaryKeyJoinColumn()
                    public UserEinstellungen getEinstellungen()
                        {
                        return einstellungen;
                        }
                    public void setEinstellungen(UserEinstellungen einstellungen)
                        {
                        this.einstellungen=einstellungen;
                        }
                    @Override
                    public boolean equals(Object obj)
                        {
                        if(obj==null)
                            {
                            return false;
                            }
                        if(obj==null||Hibernate.getClass(this)!=Hibernate.getClass(obj))
                            {
                            return false;
                            }
                        final User other=(User)obj;
                        if(this.guid!=other.guid&&(this.guid==null||!this.guid.equals(other.guid)))
                            {
                            return false;
                            }
                        return true;
                        }
                    @Override
                    public int hashCode()
                        {
                        int hash=3;
                        hash=23*hash+(this.guid!=null?this.guid.hashCode():0);
                        return hash;
                        }
                    @Override
                    public String toString()
                        {
                        return getUsername()+"/"+getNachname()+"/"+getVorname();
                        }
                    }
                    Zuletzt editiert von Christian Marquardt; 19.10.2008, 17:43.
                    Christian

                    Comment


                    • #11
                      Christian, ich danke dir wie immer für deine Mühe und dem Snippet, aber als Nichtprofi seh ich da fast net durch.
                      Deshalb habeich mich nun 3 Stunden über die TXMLDocument Komponente gehängt und versucht etwas auf die Beine zu stellen, was leider nicht funktioniert hat.

                      1. Meine BCB Help auf Englisch ist und ich die Node, Child, DOM und Active Funktionen kein Stückchen verstehe,
                      2. Es keinerlei Beispiele im Netz oder der Help für C++ gibt, wie man den Anfang machen muss.
                      3. Die Komponente doch ein wenig anspruchsvoller ist als ich gedacht hatte.

                      Greez Pixtar

                      Comment


                      • #12
                        Hallo,
                        also, die Bibliothek für C++ wurde doch angesprochen. Es gibt in boost die Unterbibliothek serialize, die genau das macht. Neben portablen Text und Binärformat gibt es auch XML.

                        Wer sich nicht mit boost auseinandersetzen will (was mit älteren Versionen des Builders ja leider nicht ganz einfach ist), kann auch auf eine kostenlose COM- Variante zurückgreifen. Wir sind ja eh an Windows gebunden, da kann man als die MSXML- Bibliothek verwenden. Die kommt mit allen möglichen MS- Produkten mit, ich denke sogar schon mit dem iexplorer. Einfach importieren und dann benutzen.

                        Code:
                           Msxml2_tlb::DOMDocumentPtr    theDocument = CoDOMDocument::Create();
                           Msxml2_tlb::IXMLDOMElementPtr theRoot;
                           Msxml2_tlb::IXMLDOMCommentPtr  theComment;
                        
                           theComment = theDocument->createComment(WideString("last updated 2004-12-31"));
                           theDocument->appendChild(theComment);
                        
                           theRoot = theDocument->createElement(WideString("Personendaten"));
                           theDocument->appendChild(theRoot);
                        
                           Msxml2_tlb::IXMLDOMElementPtr theChild, theTest;
                        
                           theChild = theDocument->createElement(WideString("Person"));
                           theChild->setAttribute(WideString("Name"), WideString("adecc Systemhaus GmbH"));
                           theChild->setAttribute(WideString("Typ"), WideString("Lieferant"));
                        
                           AddChildWithText(theDocument, theChild, "PLZ", "13595");
                           AddChildWithText(theDocument, theChild, "Ort", "Berlin");
                           AddChildWithText(theDocument, theChild, "Straße", "Pichelsdorfer Strasse 124");
                        
                           theRoot->appendChild(theChild);
                           theChild.Unbind();
                           // -------------------------------------------------------------------------
                        
                           theChild = theDocument->createElement(WideString("Person"));
                           theChild->setAttribute(WideString("Name"), WideString("Volker Hillmann"));
                           theChild->setAttribute(WideString("Typ"), WideString("Kunde"));
                        
                           AddChildWithText(theDocument, theChild, "PLZ", "13595");
                           AddChildWithText(theDocument, theChild, "Ort", "Berlin");
                           AddChildWithText(theDocument, theChild, "Straße", "Gatower Strasse 139");
                          AddChildWithText(theDocument, theChild, "c_o", "adecc Systemhaus GmbH");
                        
                           theTest = AddChild(theDocument, theChild, "Zusatz");
                           AddChildWithText(theDocument, theTest, "Hobbies", "Segeln");
                           AddChildWithText(theDocument, theTest, "Beruf", "Mathematiker");
                        
                           theRoot->appendChild(theChild);
                           theChild.Unbind();
                        
                           // -------------------------------------------------------------------------
                        
                           theDocument->save(WideString("c:\\abfall\\test.xml"));
                        
                           ::ShellExecute(this, "open", "c:\\abfall\\test.xml", NULL, NULL, SW_MAXIMIZE);
                        Habe ich mal schnell getippt, hoffe, ich habe mich nicht vertippt.

                        Schöne Grüße

                        Volker

                        Comment


                        • #13
                          Hallo,
                          per PN erreichte mich die Frage, wo man die MS XML- Bibliothek findet. Wie ich schon schrieb, es ist eine COM- Bibliothek, sollte also als solche auf den meisten Rechnern, die MS- lastig installiert sind, vorhanden sein.

                          Ich habe jetzt nur die beiden neuen auf dem Rechner (2007, 2009), aber wir haben die Bibliothek auch mit dem Builder 5 schon verwendet. Im Komponentenmenu findet sich der Eintrag "Komponente importieren", dann "Typbibliothek importieren" auswählen und aus der dann erscheinenen, langen Liste einen Eintrag "Microsoft XML, vx.0" auswählen (am besten den mit der höchsten Versionsnummer). Dann erstellt der Builder eine Unit im Importverzeichnis (cpp in Projekt einbinden). Einen Komponentenwrapper brauchst Du nicht auswählen, Du kannst die Bibliothek ja direkt verwenden.

                          Nachdem man via Co- Klasse das entsprechende Dokument erzeugt hat (hier DOM),

                          Msxml2_tlb:: DOMDocumentPtr theDocument = CoDOMDocument::Create();

                          handelt es sich im wesentlichen um die Standard- XML- Befehle, die man auch in jeder andereren Bibliothek, und damit in den Beispielen, findet, ist aber quasi kostenlos und man hat selber mit dem Verteilen keine Probleme.

                          Der Vorteil der Verwendung einer XML- Bibliothek liegt in der Struktur. Während einfache Wrapper die Daten nur flach, quasi wie eine Tabelle abspeichern, kannst Du bei der Verwendung einer Bibliothek beliebig tief strukturieren.

                          Ich habe oben im Quelltext natürlich einen Fehler gemacht, und einige Hilfsroutinen verwendet. Sorry, das kommt, wenn man mal schnell nebenher etwas zusammenkopiert und schreibt.

                          Hier die Hilfsmethoden zum obigen Beispiel. Ich glaube, die beiden unteren werden nicht verwendet. Eine ist zur Darstellung der Parserfehler, die andere zum Lesen der Informationen. Man sieht da ein Wirrwar von WideStrings und AnsiStrings, die importierte Datei verwendet WideStrings, und wenn man sich nicht selber um die BSTR kümmern will, fängt man manchmal an, die Strings WideStrings zu AnsiStrings zu machen, um dann an den Inhalt zu kommen, und auf die Destruktoren zu vertrauen.

                          Code:
                          Msxml2_tlb::IXMLDOMElementPtr AddChildWithText(Msxml2_tlb::DOMDocumentPtr& theDocument,
                                                                         Msxml2_tlb::IXMLDOMElementPtr& theRoot,
                                                                         string const& strName,
                                                                         string const& strText) {
                             Msxml2_tlb::IXMLDOMElementPtr theChild;
                             Msxml2_tlb::IXMLDOMTextPtr  theTextNode;
                             theChild    = theDocument->createElement(WideString(strName.c_str()));
                             theTextNode = theDocument->createTextNode(WideString(strText.c_str()));
                             theChild->appendChild(theTextNode);
                             theRoot->appendChild(theChild);
                             return theChild;
                             }
                          
                          // ..........................................................................
                          
                          Msxml2_tlb::IXMLDOMElementPtr AddChild(Msxml2_tlb::DOMDocumentPtr& theDocument,
                                                                 Msxml2_tlb::IXMLDOMElementPtr& theRoot,
                                                                 string const& strName) {
                             Msxml2_tlb::IXMLDOMElementPtr theChild;
                             theChild    = theDocument->createElement(WideString(strName.c_str()));
                             theRoot->appendChild(theChild);
                             return theChild;
                             }
                          
                          // ..........................................................................
                          
                          string GetAttributeValue(Msxml2_tlb::IXMLDOMNodePtr node, string const& strAttrName) {
                             AnsiString strRetVal;
                             strRetVal = node->get_attributes()->getNamedItem(WideString(strAttrName.c_str()))->get_nodeValue();
                             return strRetVal.c_str();
                             }
                          
                          // ..........................................................................
                          // wieder entfernen
                          string FormatParseError(IXMLDOMParseErrorPtr const& pe) {
                             ostrstream os;
                             os << "Your XML Document failed to load due the following error." << endl
                                << "Error #: " << AnsiString(pe->get_errorCode()).c_str() << endl
                                << ": " << AnsiString(pe->get_reason()).c_str()
                                << "Line #: " << AnsiString(pe->get_line()).c_str() << endl
                                << "Line Position: " << AnsiString(pe->get_linepos()).c_str() << endl
                                << "Position In File: " << AnsiString(pe->get_filepos()).c_str() << endl
                                << "Source Text: " << AnsiString(pe->get_srcText()).c_str() << endl
                                << "Document URL: " << AnsiString(pe->get_url()).c_str() << ends;
                             return os.str();
                             }
                          Schöne Grüße

                          Volker

                          Comment

                          Working...
                          X