#using <mscorlib.dll>
#using <System.dll>
#using <System.Web.dll>
using namespace System;
using namespace System::Web;
using namespace System::IO;
using namespace System::Collections;
using namespace System::Runtime::Serialization::Formatters::Binary;
using namespace System::Runtime::Serialization;
using namespace System::Security::Permissions;
private __sealed __gc class SingletonSerializationHelper;
// There should be only one instance of this type per AppDomain.
[Serializable]
[AspNetHostingPermission(SecurityAction::LinkDemand,
Level=AspNetHostingPermissionLevel::Minimal)]
public __gc __sealed class Singleton : public ISerializable
{
// This is the one instance of this type.
private:
static Singleton* theOneObject = new Singleton();
// Here are the instance fields.
public:
String* someString;
Int32 someNumber;
// Private constructor allowing this type to construct the singleton.
private:
Singleton()
{
// Do whatever is necessary to initialize the singleton.
someString = S"This is a String* field";
someNumber = 123;
}
// A method returning a reference to the singleton.
public:
static Singleton* GetSingleton()
{
return theOneObject;
}
// A method called when serializing a Singleton.
void GetObjectData(SerializationInfo* info, StreamingContext context)
{
// Instead of serializing this Object*, we will
// serialize a SingletonSerializationHelp instead.
info->SetType(__typeof(SingletonSerializationHelper));
// No other values need to be added.
}
// NOTE: ISerializable*'s special constructor is NOT necessary
// because it's never called
};
[Serializable]
[AspNetHostingPermission(SecurityAction::LinkDemand,
Level=AspNetHostingPermissionLevel::Minimal)]
private __gc __sealed class SingletonSerializationHelper : public IObjectReference
{
// This Object* has no fields (although it could).
// GetRealObject is called after this Object* is deserialized
public:
Object* GetRealObject(StreamingContext context)
{
// When deserialiing this Object*, return a reference to
// the singleton Object* instead.
return Singleton::GetSingleton();
}
};
[STAThread]
int main()
{
FileStream* fs = new FileStream(S"DataFile.dat", FileMode::Create);
try
{
// Construct a BinaryFormatter and use it
// to serialize the data to the stream.
BinaryFormatter* formatter = new BinaryFormatter();
// Create an array with multiple elements refering to
// the one Singleton Object*.
Singleton* a1[] = { Singleton::GetSingleton(), Singleton::GetSingleton() };
// This displays S"True".
Console::WriteLine(S"Do both array elements refer to the same Object? {0}", __box((a1->Item[0] == a1->Item[1])));
// Serialize the array elements.
formatter->Serialize(fs, a1);
// Deserialize the array elements.
fs->Position = 0;
Singleton* a2[] = (Singleton* __gc[]) formatter->Deserialize(fs);
// This displays S"True".
Console::WriteLine(S"Do both array elements refer to the same Object? {0}", __box((a2->Item[0] == a2->Item[1])));
// This displays S"True".
Console::WriteLine(S"Do all array elements refer to the same Object? {0}", __box((a1->Item[0] == a2->Item[0])));
}
catch (SerializationException* e)
{
Console::WriteLine(S"Failed to serialize. Reason: {0}", e->Message);
throw;
}
__finally
{
fs->Close();
}
return 0;
}