Serialisierung mit dem SoapFormatter



  • Hi,

    Ich versuche ein Objekt mit dem SoapFormatter zu serialisieren, aber bekomme jedes mal einen Laufzeitfehler "Object reference not set to an instance of an object"

    [cpp] Stream^ xmlStream;
    SaveFileDialog^ saveXMLDialog = gcnew SaveFileDialog();

    saveXMLDialog->InitialDirectory = L"c:\\temp\\Licenses";
    saveXMLDialog->Filter = L"xml files (.xml)|.xml";
    saveXMLDialog->Title = "Save License";

    if (saveXMLDialog->ShowDialog() == ::DialogResult::OK)
    {
    if ((xmlStream = saveXMLDialog->OpenFile()) != nullptr)
    {
    SoapFormatter ^sf = gcnew SoapFormatter();

    sf->Serialize(xmlStream, this->m_curLicenseItem);
    xmlStream->Close();
    }
    }[/cpp]

    Woran könnte es liegen?



  • Was ist denn "m_curLicenseItem"?



  • Jochen Kalmbach schrieb:

    Was ist denn "m_curLicenseItem"?

    Hier ist die Klasse:

    enum class LicenseModifierMode {Set, Add, Disable};
    enum class LicenseType {Nothing, Feature, Memory};
    enum class FeatureType {ClassicTimer, ClassicCounter};
    
    [Serializable]
    public ref class FFLicenseItem
    {
    public: 
    	FFLicenseItem() : m_Name(L""), m_ID(-1), m_Version(-1), 
    		m_Mode(LicenseModifierMode::Set), m_LicenseType(LicenseType::Nothing), m_FeatureType(FeatureType::ClassicTimer),
    		m_Unlimited(false), m_PlusDays(0), m_PlusMonths(0), m_PlusYears(0) {}
    
    	FFLicenseItem(const FFLicenseItem^ item) : m_Name(item->m_Name), m_ID(item->m_ID), m_Version(item->m_Version), 
    		m_Mode(item->m_Mode), m_LicenseType(item->m_LicenseType), m_FeatureType(item->m_FeatureType),
    		m_Unlimited(item->m_Unlimited), m_PlusDays(item->m_PlusDays), m_PlusMonths(item->m_PlusMonths), m_PlusYears(item->m_PlusYears), 
    		m_DatExpirationDate (item->m_DatExpirationDate) {}
    
    private: 
    	String^ m_Name;
    	int m_ID;
    	int m_Version;
    	LicenseModifierMode m_Mode;
    	LicenseType m_LicenseType; 
    	FeatureType m_FeatureType; 
    	bool m_Unlimited;
    	DateTime^ m_DatExpirationDate;
    	int m_PlusDays, m_PlusMonths, m_PlusYears;
    
    };
    


  • Folgendes Programm:

    using namespace System;
    
    enum class LicenseModifierMode {Set, Add, Disable}; 
    enum class LicenseType {Nothing, Feature, Memory}; 
    enum class FeatureType {ClassicTimer, ClassicCounter}; 
    
    [Serializable] 
    public ref class FFLicenseItem 
    { 
    public: 
        FFLicenseItem() : m_Name(L""), m_ID(-1), m_Version(-1), 
            m_Mode(LicenseModifierMode::Set), m_LicenseType(LicenseType::Nothing), m_FeatureType(FeatureType::ClassicTimer), 
            m_Unlimited(false), m_PlusDays(0), m_PlusMonths(0), m_PlusYears(0) {} 
    
        FFLicenseItem(const FFLicenseItem^ item) : m_Name(item->m_Name), m_ID(item->m_ID), m_Version(item->m_Version), 
            m_Mode(item->m_Mode), m_LicenseType(item->m_LicenseType), m_FeatureType(item->m_FeatureType), 
            m_Unlimited(item->m_Unlimited), m_PlusDays(item->m_PlusDays), m_PlusMonths(item->m_PlusMonths), m_PlusYears(item->m_PlusYears), 
            m_DatExpirationDate (item->m_DatExpirationDate) {} 
    
    private: 
        String^ m_Name; 
        int m_ID; 
        int m_Version; 
        LicenseModifierMode m_Mode; 
        LicenseType m_LicenseType; 
        FeatureType m_FeatureType; 
        bool m_Unlimited; 
        DateTime^ m_DatExpirationDate; 
        int m_PlusDays, m_PlusMonths, m_PlusYears; 
    
    };
    int main()
    {
      FFLicenseItem ^li = gcnew FFLicenseItem();
      System::Runtime::Serialization::Formatters::Soap::SoapFormatter ^sf = gcnew System::Runtime::Serialization::Formatters::Soap::SoapFormatter();
      sf->Serialize(Console::OpenStandardOutput(), li);
    }
    

    läuft bei mir wunderbar und liefert:

    <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x
    sd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org
    /soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmln
    s:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyl
    e="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
    <a1:FFLicenseItem id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/assem/MC
    PP_Console%2C%20Version%3D1.0.2596.19498%2C%20Culture%3Dneutral%2C%20PublicKeyTo
    ken%3Dnull">
    <m_Name id="ref-3"></m_Name>
    <m_ID>-1</m_ID>
    <m_Version>-1</m_Version>
    <m_Mode>Set</m_Mode>
    <m_LicenseType>Nothing</m_LicenseType>
    <m_FeatureType>ClassicTimer</m_FeatureType>
    <m_Unlimited>false</m_Unlimited>
    <m_DatExpirationDate xsi:null="1"/>
    <m_PlusDays>0</m_PlusDays>
    <m_PlusMonths>0</m_PlusMonths>
    <m_PlusYears>0</m_PlusYears>
    </a1:FFLicenseItem>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    


  • Der Fehler lag an:
    DateTime^ m_DatExpirationDate;
    Diese Membervariable muss nicht als Referenztyp deklariert werden, sonder als Wertetyp:
    DateTime m_DatExpirationDate;


Anmelden zum Antworten