.Net/C#

C# Serialize, Deserialize

동구밖과수원 2012. 8. 21. 11:36
    /// <summary>
    /// Serialize할 유형입니다.
    /// </summary>
    public enum SerializeType
    {
        /// <summary>
        /// BinaryFormatter
        /// </summary>
        BinaryFormatter,
        /// <summary>
        /// SoapFormatter
        /// </summary>
        SoapFormatter
    }

    /// <summary>
    /// Serialize와 Deserialize를 편리하게 이용하는 Static Class
    /// </summary>
    public static class Serialization
    {
        /// <summary>
        /// 직렬화합니다.
        /// </summary>
        /// <param name="serializeType">Serialize 유형</param>
        /// <param name="filePath">Write할 파일경로</param>
        /// <param name="graph">그래프의 루트에 있는 serialize할 개체입니다.</param>
        public static void Serialize(SerializeType serializeType, string filePath, object graph)
        {
            try
            {
                switch (serializeType)
                {
                    case SerializeType.BinaryFormatter: BinaryFormatterSerialize(filePath, graph); break;
                    case SerializeType.SoapFormatter: SoapFormatterSerialize(filePath, graph); break;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 역직렬화합니다.
        /// </summary>
        /// <param name="serializeType">Serialize 유형</param>
        /// <param name="filePath">Read할 파일경로</param>
        /// <param name="graph">그래프의 루트에 있는 Deserialize할 개체입니다.</param>
        public static object Deserialize(SerializeType serializeType, string filePath, object graph)
        {
            try
            {
                switch (serializeType)
                {
                    case SerializeType.BinaryFormatter: return BinaryFormatterDeserialize(filePath, graph); 
                    case SerializeType.SoapFormatter: return SoapFormatterDeserialize(filePath, graph); 
                }
                throw new NotSupportedException("지원하지 않는 형식입니다.");
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        /// <summary>
        /// BinaryFormatter를 이용해 Serialize합니다.
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="graph"></param>
        private static object BinaryFormatterDeserialize(string filePath, object graph)
        {
            FileStream fs = null;
            try
            {
                fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                BinaryFormatter bf = new BinaryFormatter();
                object obj = bf.Deserialize(fs);
                fs.Close();
                return obj;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                
                if (fs != null)
                    fs.Close();
            }
        }


        /// <summary>
        /// SoapFormatter를 이용해 Serialize합니다.
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="graph"></param>
        private static object SoapFormatterDeserialize(string filePath, object graph)
        {
            FileStream fs = null;
            try
            {
                fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                SoapFormatter sf = new SoapFormatter();
                object obj = sf.Deserialize(fs);
                fs.Close();
                return obj;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
        }


        /// <summary>
        /// BinaryFormatter를 이용해 Serialize합니다.
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="graph"></param>
        private static void BinaryFormatterSerialize(string filePath, object graph)
        {
            FileStream fs = null;
            try
            {
                fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(fs, graph);
                fs.Close();
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
        }


        /// <summary>
        /// SoapFormatter를 이용해 Serialize합니다.
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="graph"></param>
        private static void SoapFormatterSerialize(string filePath, object graph)
        {
            FileStream fs = null;
            try
            {
                fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
                SoapFormatter sf = new SoapFormatter();
                sf.Serialize(fs, graph);
                fs.Close();
            }
            catch(Exception e)
            {
                throw e;
            }
            finally
            {
                if (fs != null)
                    fs.Close();
            }
        }
       
    }