C#序列化反序列化帮助类

//转载:http://hi.baidu.com/fxh19860822/blog/item/df35230b3ded441495ca6bd5.html
在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化   
 
    /// <summary>
    /// 提供序列化和反序列化对象的相关静态方法。
    /// </summary>
    public class SerializerHelper
    {
        /// <summary>
        /// 将指定的对象序列化为XML文件或二进制文件并返回执行状态。
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="path">保存路径</param>
        /// <param name="isBinaryFile">序列化后生成的文件类型是否为二进制文件,true为二进制文件,否则为xml文件或文本文件</param>
        /// <returns>返回执行状态</returns>
        public static bool Serialize(Object o, string path, bool isBinaryFile)
        {
            bool flag = false;
            try
            {
                if (isBinaryFile)
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    using (FileStream stream = new FileStream(path, FileMode.Create))
                    {
                        formatter.Serialize(stream, o);
                        flag = true;
                    }
                }
                else
                {
                    XmlSerializer serializer = new XmlSerializer(o.GetType());
                    using (XmlTextWriter writer = new XmlTextWriter(path, Encoding.UTF8))
                    {
                        writer.Formatting = Formatting.Indented;
                        XmlSerializerNamespaces n = new XmlSerializerNamespaces();
                        n.Add("", "");
                        serializer.Serialize(writer, o, n);
                        flag = true;
                    }
                }
            }
            catch { flag = false; }
            return flag;
        }

        /// <summary>
        /// 将指定的对象序列化为XML格式的字符串并返回。
        /// </summary>
        /// <param name="o">待序列化的对象</param>
        /// <returns>返回序列化后的字符串</returns>
        public static string Serialize(Object o)
        {
            string xml = "";
            try
            {
                XmlSerializer serializer = new XmlSerializer(o.GetType());
                using (MemoryStream mem = new MemoryStream())
                {
                    using (XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8))
                    {
                        writer.Formatting = Formatting.Indented;
                        XmlSerializerNamespaces n = new XmlSerializerNamespaces();
                        n.Add("", "");
                        serializer.Serialize(writer, o, n);

                        mem.Seek(0, SeekOrigin.Begin);
                        using (StreamReader reader = new StreamReader(mem))
                        {
                            xml = reader.ReadToEnd();
                        }
                    }
                }
            }
            catch { xml = ""; }
            return xml;
        }

        /// <summary>
        /// 从指定的文件中反序列化出对应的对象并返回。
        /// </summary>
        /// <param name="t">要反序列化的对象类型</param>
        /// <param name="path">文件路径</param>
        /// <param name="isBinaryFile">反序列化的文件类型是否为二进制文件,true为二进制文件,否则为xml文件或文本文件</param>
        /// <returns>返回Object</returns>
        public static object Deserialize(Type t, string path, bool isBinaryFile)
        {
            Object o = null;
            try
            {
                if (!isBinaryFile)
                {
                    XmlSerializer serializer = new XmlSerializer(t);
                    using (XmlTextReader reader = new XmlTextReader(path))
                    {
                        o = serializer.Deserialize(reader);
                    }
                }
                else
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
                    {
                        o = formatter.Deserialize(stream);
                    }
                }
            }
            catch { o = null; }
            return o;
        }

        /// <summary>
        /// 将指定的xml格式的字符反序列化为对应的对象并返回。
        /// </summary>
        /// <param name="t">对象的类型</param>
        /// <param name="xml">待反序列化的xml格式的字符的内容</param>
        /// <returns>返回对应的对象</returns>
        public static Object Deserialize(Type t, string xml)
        {
            Object o = null;
            try
            {
                XmlSerializer serializer = new XmlSerializer(t);
                using (MemoryStream mem = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
                {
                    o = serializer.Deserialize(mem);
                }
            }
            catch { o = null; }
            return o;
        }

        /// <summary>
        /// 将指定的对象序列化为XML文件,并返回执行状态。
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="path">生成的文件名称</param>
        /// <returns>返回执行状态</returns>
        public static bool XmlSerialize(Object o, string path)
        {
            return SerializerHelper.Serialize(o, path, false);
        }

        /// <summary>
        /// 将指定XML文件,反序列化为对应的对象并返回。
        /// </summary>
        /// <param name="t">对象的类型</param>
        /// <param name="path">XML文件路径</param>
        /// <returns>返回对象</returns>
        public static Object XmlDeserialize(Type t, string path)
        {
            return SerializerHelper.Deserialize(t, path, false);
        }

        /// <summary>
        /// 将指定的对象序列化为二进制文件,并返回执行状态。
        /// </summary>
        /// <param name="o">要序列化的对象</param>
        /// <param name="path">生成的文件名称</param>
        /// <returns>返回执行状态</returns>
        public static bool BinarySerialize(Object o, string path)
        {
            return SerializerHelper.Serialize(o, path, true);
        }

        /// <summary>
        /// 将指定二进制文件,反序列化为对应的对象并返回。
        /// </summary>
        /// <param name="t">对象的类型</param>
        /// <param name="path">XML文件路径</param>
        /// <returns>返回对象</returns>
        public static Object BinaryDeserialize(Type t, string path)
        {
            return SerializerHelper.Deserialize(t, path, true);
        }
    }
http://hi.baidu.com/fxh19860822/blog/item/381f1cd20daf3a3f970a16db.html 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏苦逼的码农

从jvm角度看懂类初始化、方法重载、重写。

类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段。我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试做题过程中最容易遇到的,假如你想...

13320
来自专栏yl 成长笔记

c# typeof 与 GetType 作用与区别

Used to obtain the "System.Type" object for a type. A 'typeof‘ expression takes ...

32610
来自专栏mukekeheart的iOS之旅

OC学习6——面相对象的三大特性

我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征。OC学习篇之---类的三大特性(封装,继承,多态) 1、封装(Enca...

29180
来自专栏拭心的安卓进阶之路

深入理解 Java 泛型

首先提个问题: Java 泛型的作用是什么?泛型擦除是什么?泛型一般用在什么场景? 如果这个问题你答不上来,那这篇文章可能就对你有些价值。 什么是泛...

60990
来自专栏Golang语言社区

深入分析golang多值返回以及闭包的实现

一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,...

55360
来自专栏Fish

两天了解scala

最前面的话 因为spark的源语言是scala,所以,为了看懂spark的操作并且为了以后看spark源码做准备,先看scala还是很有必要的。另外这里主要是看...

21090
来自专栏专注 Java 基础分享

基本数据类型及其包装类(二)

上篇文章我们简单介绍了包装的相关基本概念,并简单分析了 Integer 类中的几个核心的方法源码,但是有关自动拆装箱的概念限于篇幅并没能完成介绍,本篇还将分析几...

33660
来自专栏抠抠空间

细数Python中的数据类型以及他们的方法

一、数据类型的种类及主要功能 1、数字类型   数字类型主要是用来计算,它分为整数类型int和浮点类型float 2、布尔类型   布尔类型主要是用于判断,它分...

34250
来自专栏一“技”之长

Swift专题讲解十八——异常处理 原

        代码的运行很多时候并不会完全按照程序员的设想进行,编写代码时进行可控的异常处理机制是十分必要的。通常,对于一个特定的操作,程序员可以定义一个继承...

8320
来自专栏大前端_Web

jsvascript—谜之this?

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

18740

扫码关注云+社区

领取腾讯云代金券