using System;

namespace Serilestirme
{
	[Serializable()] // Birinci kural
	public class RadyoSahip
	{
		private string _AdSoyad;
		[NonSerialized()] // Kural 2: Serilestirilmesini istemedigimiz fieldlar iin NonSerialized attribute' unu kullaniriz
		private System.Int32 _VergiNo;

		public RadyoSahip(string adS,System.Int32 vergiNo)
		{
			_AdSoyad=adS;
			_VergiNo=vergiNo;
		}
		public override string ToString()
		{
			return _AdSoyad;
		}

	}
}


using System;
using System.Runtime.Serialization;

namespace Serilestirme
{
	[Serializable()]
	public class RadyoKanal:ISerializable
	{
		private string _Frekans;
		private string _KanalAdi;
		private string _MuzikTuru;
		//private double _Deger=9000; // nc kural. Kaynaktan deserialize isleminden nce sinifa yeni bir ye eklenirse deserialization olmaz. Bunun nne gemek iin ISerializable arayznden faydalanilir.

		// Birinci kural; eger serilestirmek istedigimiz tip ierisinde, kendi olusturdugumuz baska tipler var ise onlarinda serilestirilebilir olmasi gerekir.
		private RadyoSahip _Sahip;

		public RadyoKanal(string fre,string ad,string tur,RadyoSahip s)
		{
			_Frekans=fre;
			_KanalAdi=ad;
			_MuzikTuru=tur;
			_Sahip=s;
		}
        private RadyoKanal(SerializationInfo info, StreamingContext ctx)
        {
            _Frekans = info.GetString("Radyo Frekans");
            _KanalAdi = info.GetString("Kanal Adi");
            _MuzikTuru = info.GetString("Muzik Turu");
            _Sahip = (RadyoSahip)info.GetValue("Kanal Sahibi", typeof(RadyoSahip));
        }

		public override string ToString()
		{
			return _Frekans+" "+_KanalAdi+" "+_MuzikTuru+" "+_Sahip.ToString();
		}


        #region ISerializable Members

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Radyo Frekans", _Frekans);
            info.AddValue("Kanal Adi", _KanalAdi);
            info.AddValue("Muzik Turu", _MuzikTuru);
            info.AddValue("Kanal Sahibi", _Sahip);
        }

        #endregion
    }
}


using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

namespace Serilestirme
{
	class Program
	{
		private static void Serialize()
		{
			FileStream fs=null;
			try
			{
				RadyoKanal kanal=new RadyoKanal("999.00","BurkiFM","Alternative Rock",new RadyoSahip("Burak Selim Senyurt",10000));
				fs=new FileStream("Test.xml",FileMode.OpenOrCreate);
				SoapFormatter bf=new SoapFormatter();				
				bf.Serialize(fs,kanal);
			}
			catch(Exception err)
			{
				Console.WriteLine(err.Message);
			}
			finally
			{
				fs.Close();
			}
		}

		private static void DeSerialize()
		{
			FileStream fs=null;
			try
			{
				fs=new FileStream("Test.xml",FileMode.Open);
				SoapFormatter sf=new SoapFormatter();
				RadyoKanal kanal=(RadyoKanal)sf.Deserialize(fs);
				Console.WriteLine(kanal.ToString());
			}
			catch(Exception err)
			{
				Console.WriteLine(err.Message);
			}
			finally
			{
				fs.Close();
			}
		}

		[STAThread]
		static void Main(string[] args)
		{
            Serialize();
			DeSerialize();
		}
	}
}
