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;