Bei Serialize prüfen ob richtiges Object???



  • Hallo

    meine Abgeleitete Klasse und die Serialize Methode, funkt auch alles wundabar

    Serialize(CArchive &ar)
    {
        CObject::Serialize(ar);
    
        if (ar.IsStoring())
        {
                    // nur CString und int Typen
            ar << m_strName << m_nGroesse << m_strDateiPfad;
        }
        else
        {
            ar >> m_strName >> m_nGroesse >> m_strDateiPfad;
        //  ar.ReadObject(m_strName.IsKindOf(RUNTIME_CLASS(CString)));
        }
    

    wenn man nun Datei->Öffnen sagt und eine Datei auswählt die aber gar kein Typ ist von der Klasse die ich abspeichere sondern eine wilkürliche Datei dann schmirt er beim Öffnen ab.

    Nun möchte ich dies Verhindern. Habe gedacht mit ReadObject und IsKindOf aber CString wird ja nicht von CObject abgeleitet und dies würde ja auch nicht bei dem int Typ gehen.

    Weiß jemand wie ich das machen kann.

    Danke



  • Erstelle doch das Objekt komplett dynamisch ! ( mit CRuntimeClass )



  • Kannst du (oder jemand anders) mir mal ein Beispiel geben???



  • RUNTIME_CLASS(CDeineKlasse)



  • jo ich habe auch ein Beispiel gefunden.

    CRuntimeClass* pRTC = RUNTIME_CLASS(CMyObject);
    CMyClass* pMyObject = (CMyClass*)pRTC->CreateObject();
    

    aber was soll mir das bringen? Ich erstelle es Dynamisch ja wie genau soll ich das bei meinem Beispiel tun??

    Die Serialize Methode seht ihr ja. Diese Klasse lege ich in ein CObArray mit vielen anderen dieser Klasse.
    
    arr.Serialize(..) so wird Serialize und wie soll ich nun CRuntimeClass damit benutzen?? 
    
    Wie ihr seht habe ich noch Verständnis Probleme.
    


  • Also noch ein Tip ...

    Serialize(CArchive &ar)
    {
      if( ar.IsStoring())
      {
        ar.WriteObject( m_pMemberObject);
      }
      else
      {
        CObject* pObj = ar.ReadObject( RUNTIME_CLASS( CMemberObject))
        if( pObj)
          m_pMemberObject = (CMemberObject*)pObj;
      }
    }
    

    Innerhalb Deiner Serialize-Funktion kannst Du nur abfragen, ob das Objekt, welches eingelesen werden soll, auch dem aktuellen Objekt entspricht.
    Nachteil hier ist: Es ist schon erstellt, du müsstest also eine Membervariable anlegen, so dass von ausserhalb geprüft werden kann, ob das Objekt gültig ist.

    Abprüfen innerhalb geht folgendermassen:

    Serialize(CArchive &ar)
    {
      if( ar.IsStoring())
      {
        ar.WriteClass( this);
        // nur CString und int Typen
        ar << m_strName << m_nGroesse << m_strDateiPfad;
      }
      else
      {
        if( IsKindOf( ar.ReadClass()))
        {
          ar >> m_strName >> m_nGroesse >> m_strDateiPfad;
          m_bIsValid = true;
        }
        else
          m_bIsValid = false;
      }
    }
    

Anmelden zum Antworten