//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Text;

public class DateClass
{
    public DateTime d;
	public String s;

	public DateClass()
	{
	}
    public DateClass (String s, DateTime d)
	{
		this.s = s;
		this.d = d;
    }

    public static void Main(String [] args)
	{
		DateTime d = DateTime.Now;
		DateClass corg = new DateClass("To jest test", d);
		DateClass cnew = null;
		string filename = "dateclass.xml";
		
		// Serializacja oryginalnego obiektu klasy
		try
		{
			XmlSerializer ser = new XmlSerializer(typeof(DateClass));
			TextWriter writer = new StreamWriter(filename);
			ser.Serialize(writer, corg);
			writer.Close();
		} 
		catch (Exception e)
		{
			Console.WriteLine(e);
			return;
		}
	
		// Deserializacja do nowego obiektu klasy
		try
		{
			XmlSerializer ser = new XmlSerializer(typeof(DateClass));
			TextReader reader = new StreamReader(filename);
			cnew = (DateClass)ser.Deserialize(reader);
			reader.Close();
		}
		catch (Exception e)
		{
			Console.WriteLine(e);
			return;
		}
	    
		// Wyświetlenie w celu sprawdzenia poprawności
		Console.WriteLine();
		Console.WriteLine("Wyświetlanie oryginalnej klasy...");
		Console.WriteLine(corg);
		Console.WriteLine();
		Console.WriteLine("Wyświetlanie nowej klasy...");
		Console.WriteLine(cnew);
		Console.WriteLine();
		Console.WriteLine("Klasy oryginalna i nowa powinny być identyczne!");
		Console.WriteLine();
   }
    
	// Konwersja klasy do bardziej czytelnego formatu. Jest to przydatne w czasie usuwania błędów
    public override string ToString()
	{
		StringBuilder sb = new StringBuilder();
		sb.Append(s + ": ");
		sb.Append(d.ToLongDateString() + " " + d.ToLongTimeString());
		return(sb.ToString());
    }
}



 









