void TestObjectSerialization3()
{
	ObjectFactory<Serializable> factory;

	//factory.Register("ObjectA", new ObjectCreator<ObjectA, Serializable>());
	factory.Register("ObjectD", new ObjectCreator<ObjectD, Serializable>());


	ObjectD d = ObjectD();
	d.Set(6, 7, 8, "ObjectD baby");
	d.AccessA().Set(1, 2, 3, "ObjectA baby");
	
	BinaryFileStream stream;

	stream.StartWrite("test3.txt");
	d.Save(stream);
	stream.SerializeQueue();
	stream.Close();

	std::vector<Serializable *> load;

	stream.StartRead("test3.txt", factory);
	ObjectD * loaded = stream.GetNext<ObjectD*>();

	stream.Close();
	loaded->Print();
	delete loaded;
}
void TestObjectSerialization()
{
	ObjectFactory<Serializable> factory;

	factory.Register("ObjectA", new ObjectCreator<ObjectA, Serializable>());
	factory.Register("ObjectB", new ObjectCreator<ObjectB, Serializable>());
	factory.Register("ObjectC", new ObjectCreator<ObjectC, Serializable>());
	factory.Register("STLVectorObjectIO", new ObjectCreator<STLVectorObjectIO<ObjectA>, Serializable>());


	ObjectA a = ObjectA();
	a.Set(1, 2, 3, "ObjectA baby");

	ObjectB b = ObjectB();
	b.Set(6, 7, 8, "ObjectB baby");
	

	ObjectC c = ObjectC();
	c.Set(3, 4, 5, "ObjectC baby");

	b.data4 = &c;
	c.data4 = &b;

	BinaryFileStream stream;

	stream.StartWrite("test.txt");
	a.Save(stream);
	b.Save(stream);
	//c.Save(stream, true);
	stream.SerializeQueue();
	stream.Close();

	std::vector<Serializable *> load;

	stream.StartRead("test.txt", factory);
	//stream.LoadObjects(factory);

	ObjectA * loaded_a = stream.GetNext<ObjectA*>();
	ObjectB * loaded_b = stream.GetNext<ObjectB*>();
	ObjectC * loaded_c = stream.GetNext<ObjectC*>();

	stream.Close();

	loaded_a->Print();
	loaded_b->Print();
	loaded_c->Print();

	delete loaded_a;
	delete loaded_b;
	delete loaded_c;
}
void TestObjectSerialization2()
{
	ObjectFactory<Serializable> factory;

	factory.Register("ObjectA", new ObjectCreator<ObjectA, Serializable>());
	factory.Register("ObjectB", new ObjectCreator<ObjectB, Serializable>());
	factory.Register("ObjectC", new ObjectCreator<ObjectC, Serializable>());
	factory.Register("STLVectorObjectIO_ObjectA", new ObjectCreator<STLVectorObjectIO<ObjectA>, Serializable>());
	factory.Register("STLVectorObjectIO_ObjectB", new ObjectCreator<STLVectorObjectIO<ObjectB>, Serializable>());
	factory.Register("STLVectorObjectIO_ObjectC", new ObjectCreator<STLVectorObjectIO<ObjectC>, Serializable>());
	factory.Register("STLVectorObjectIO_Serializable", new ObjectCreator<STLVectorObjectIO<Serializable>, Serializable>());


	
	ObjectC a = ObjectC();
	a.Set(1, 2, 3, "ObjectA baby");

	ObjectC b = ObjectC();
	b.Set(4, 5, 6, "ObjectB baby");

	ObjectC c = ObjectC();
	c.Set(7, 8, 9, "ObjectC baby");

	ObjectB d = ObjectB();
	d.Set(10, 11, 12, "ObjectD baby");

	ObjectB e = ObjectB();
	e.Set(13, 14, 15, "ObjectE baby");

	ObjectB f = ObjectB();
	f.Set(16, 17, 18, "ObjectF baby");

	a.data4 = &d;
	b.data4 = &e;
	c.data4 = &f;

	d.data4 = &a;
	e.data4 = &b;
	f.data4 = &c;


	BinaryFileStream stream;

	std::vector<ObjectC const *> to_serialize_C;
	to_serialize_C.push_back(&a);
	to_serialize_C.push_back(&b);
	to_serialize_C.push_back(&c);
	STLVectorObjectIO<ObjectC>  * proxy_C  = new STLVectorObjectIO<ObjectC>(&to_serialize_C, "ObjectC");

	std::vector<ObjectB const *> to_serialize_B;
	to_serialize_B.push_back(&d);
	to_serialize_B.push_back(&e);
	to_serialize_B.push_back(&f);
	STLVectorObjectIO<ObjectB>  * proxy_B  = new STLVectorObjectIO<ObjectB>(&to_serialize_B, "ObjectB");

	std::vector<Serializable *> to_serialize_master;
	to_serialize_master.push_back(proxy_C);
	to_serialize_master.push_back(proxy_B);
	STLVectorObjectIO<Serializable>  * proxy_master  = new STLVectorObjectIO<Serializable>(&to_serialize_master, "Serializable");


	stream.StartWrite("test2.txt");
	proxy_master->Save(stream);
	stream.SerializeQueue();
	stream.Close();
	

	std::vector<Serializable *> load;
	

	stream.StartRead("test2.txt", factory);
	STLVectorObjectIO<Serializable> * loaded_vector_proxy_M = stream.GetNext<STLVectorObjectIO<Serializable> *>();
	stream.SetEOF();


	STLVectorObjectIO<ObjectC> * loaded_vector_proxy_C = loaded_vector_proxy_M->GetAs<STLVectorObjectIO<ObjectC>*>(0);
	STLVectorObjectIO<ObjectB> * loaded_vector_proxy_B = loaded_vector_proxy_M->GetAs<STLVectorObjectIO<ObjectB>*>(1);
	
	for(unsigned int i = 0; i < loaded_vector_proxy_C->Size(); ++i)
	{
		(*loaded_vector_proxy_C)[i]->Print();
	}
	for(unsigned int i = 0; i < loaded_vector_proxy_B->Size(); ++i)
	{
		(*loaded_vector_proxy_B)[i]->Print();
	}

	loaded_vector_proxy_C->DeleteObjects();
	loaded_vector_proxy_B->DeleteObjects();
	loaded_vector_proxy_M->DeleteObjects();
	delete loaded_vector_proxy_M;
}