保存加载(XML,二进制,JSON)

 
     #region XML
    /// <summary>
    ///  保存 XML
    /// </summary>
    /// <param name="filePath">保存文件路径</param>
    /// <param name="source">内容</param>
    /// <param name="type">内容类型</param>
    /// <param name="rootName">根节点名称</param>
    public static bool SaveToXML(string filePath,object source,Type type, string rootName = null)
    {
        if(string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.Log("filePath is null");
            return false;
        }

        if(source == null)
        {
            LogUtil.LogError("source is not allowed to be null");
            return false;
        }

        if(type == null)
        {
            type = source.GetType();
        }

        //文件夹判断
        string dirPath = Path.GetDirectoryName(filePath);
        if (!Directory.Exists(dirPath))
            Directory.CreateDirectory(dirPath);

        using(StreamWriter writer = new StreamWriter(filePath))
        {
            try
            {
                XmlSerializer xml = string.IsNullOrWhiteSpace(rootName) 
                    ? new XmlSerializer(type):new XmlSerializer(type, new XmlRootAttribute(rootName));
                xml.Serialize(writer, source);
            }
            catch(System.Exception e)
            {
                LogUtil.LogError(e.Message);
                return false;
            }
        }

        LogUtil.Log("XML Save Success!");
        return true;
    }
    /// <summary>
    /// 加载 XML
    /// </summary>
    /// <param name="filePath">文件路径</param>
    /// <param name="type">类型</param>
    /// <param name="rootName">根节点名称</param>
    /// <returns></returns>
    public static object LoadFromXML(string filePath,Type type,string rootName)
    {
        if(!File.Exists(filePath))
        {
            LogUtil.LogError("filePath is not exit");
            return null;
        }

        if(type == null)
        {
            LogUtil.LogError("type is not allowed to be null");
            return null;
        }

        object obj =  null;
        try
        {
            using(StreamReader stream = new StreamReader(filePath))
            {
                XmlSerializer xml = string.IsNullOrWhiteSpace(rootName)
                    ? new XmlSerializer(type) : new XmlSerializer(type, new XmlRootAttribute(rootName));
                obj = xml.Deserialize(stream);
            }
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return null;
        }

        LogUtil.Log("Load From XML Successful~");
        return obj;
    }
    #endregion

    #region 二进制
    /// <summary>
    /// 保存 二进制
    /// </summary>
    /// <param name="filePath">文件保存路径</param>
    /// <param name="source">内容</param>
    /// <param name="Hidden">文件夹是否隐藏</param>
    /// <returns></returns>
    public static bool SaveToBinary(string filePath,object source,bool Hidden)
    {
        if (string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.Log("filePath is null");
            return false;
        }

        if (source == null)
        {
            LogUtil.LogError("source is not allowed to be null");
            return false;
        }

        try
        {
            using(FileStream stream = new FileStream(filePath,FileMode.OpenOrCreate,FileAccess.Write,FileShare.Write))
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(stream, source);
            }
        }
        catch(Exception x)
        {
            LogUtil.LogError(x.Message);
            return false;
        }
        finally
        {
            File.SetAttributes(filePath, Hidden ? FileAttributes.Hidden : FileAttributes.Normal);
        }

        LogUtil.Log("Binary Save Success~");
        return true;
    }
    /// <summary>
    /// 加载 二进制
    /// </summary>
    /// <param name="filePath">文件路径</param>
    /// <returns></returns>
    public static object LoadFromBinary(string filePath)
    {
        if (!File.Exists(filePath))
        {
            LogUtil.LogError("filePath is not exit");
            return null;
        }

        object obj = null;
        try
        {
            using(FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                BinaryFormatter bf = new BinaryFormatter();
                obj = bf.Deserialize(stream);
            }
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return null;
        }

        LogUtil.Log("Load From Binary Successful~");
        return obj;
    }
    #endregion

    #region MyRegion
    /// <summary>
    /// 保存 Json (静态字段无法保存)
    /// </summary>
    /// <param name="filePath">保存文件路径</param>
    /// <param name="source">内容</param>
    /// <returns></returns>
    public static bool SaveToJson_1(string filePath,object source)
    {
        if (string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.Log("filePath is null");
            return false;
        }

        if (source == null)
        {
            LogUtil.LogError("source is not allowed to be null");
            return false;
        }

        try
        {
            File.WriteAllText(filePath, JsonConvert.SerializeObject(source));
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return false;
        }

        LogUtil.Log("Json Save Success~");
        return true;
    }
    /// <summary>
    /// 保存 Json (中文是乱码。不可以有float。不能有二维数组。加载正常)
    /// </summary>
    /// <param name="filePath">保存文件路径</param>
    /// <param name="source">内容</param>
    /// <returns></returns>
    public static bool SaveToJson_2(string filePath, object source)
    {
        if (string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.Log("filePath is null");
            return false;
        }

        if (source == null)
        {
            LogUtil.LogError("source is not allowed to be null");
            return false;
        }

        try
        {
            File.WriteAllText(filePath, JsonMapper.ToJson(source));
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return false;
        }

        LogUtil.Log("Json Save Success~");
        return true;
    }
    /// <summary>
    /// 保存 Json (静态字段无法保存,带有泛型的字段可能存在问题,还有其他等。大工程不建议)
    /// </summary>
    /// <param name="filePath">保存文件路径</param>
    /// <param name="source">内容</param>
    /// <returns></returns>
    public static bool SaveToJson_3(string filePath, object source)
    {
        if (string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.Log("filePath is null");
            return false;
        }

        if (source == null)
        {
            LogUtil.LogError("source is not allowed to be null");
            return false;
        }

        try
        {
            File.WriteAllText(filePath, JsonUtility.ToJson(source));
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return false;
        }

        LogUtil.Log("Json Save Success~");
        return true;
    }
    /// <summary>
    /// 读取 Json
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="filePath">文件路径</param>
    /// <returns></returns>
    public static T LoadFromJson_1<T>(string filePath)
    {
        if (string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.LogError("filePath is not allowed to be null");
            return default(T);
        }

        if(!File.Exists(filePath))
        {
            LogUtil.LogError("filePath is not exit");
            return default(T);
        }

        T t  = default(T);
        try
        {
            string json = File.ReadAllText(filePath);
            //using (StringReader sr = new StringReader(json))
            //{
            //    JsonSerializer serializer = new JsonSerializer();

            //    t = serializer.Deserialize<T>(new JsonTextReader(sr));
            //}
            t = JsonConvert.DeserializeObject<T>(json);
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return default(T);
        }

        LogUtil.Log("Load From Json Successful");
        return t;
    }
    /// <summary>
    /// 读取 Json
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="filePath">文件路径</param>
    /// <returns></returns>
    public static T LoadFromJson_2<T>(string filePath)
    {
        if (string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.LogError("filePath is not allowed to be null");
            return default(T);
        }

        if (!File.Exists(filePath))
        {
            LogUtil.LogError("filePath is not exit");
            return default(T);
        }

        T t = default(T);
        try
        {
            string json = File.ReadAllText(filePath);
            t = JsonMapper.ToObject<T>(json);
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return default(T);
        }

        LogUtil.Log("Load From Json Successful");
        return t;
    }
    /// <summary>
    /// 读取 json
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="filePath">文件路径</param>
    /// <returns></returns>
    public static T LoadFromJson_3<T>(string filePath)
    {
        if (string.IsNullOrWhiteSpace(filePath))
        {
            LogUtil.LogError("filePath is not allowed to be null");
            return default(T);
        }

        if (!File.Exists(filePath))
        {
            LogUtil.LogError("filePath is not exit");
            return default(T);
        }

        T t = default(T);
        try
        {
            string json = File.ReadAllText(filePath);
            t = JsonUtility.FromJson<T>(json);
        }
        catch(Exception e)
        {
            LogUtil.LogError(e.Message);
            return default(T);
        }

        LogUtil.Log("Load From Json Successful");
        return t;
    }
    #endregion
 
 
 
 
 
 
 
 
 
 
 
 
 
二进制XML存储方案BinXML实现方法 BinXML是我个人杜撰出来的名字,不知道是否合适,也不知道是否已存在类似的解决方案。在vcer.net上我将前一段时间的这个BinXML方案贡献出来,希望能够与广大vcer分享。 当时问题的背景是这样的,项目需要确定存储方案,这种方案需要满足如下要求: · 生成的单机板exe尽可能的不依赖于其它软件,如:数据库管理系统; · 存储的数据最好能够方便的拷贝,以满足项目的上报、汇总的功能; · 存储的格式以后可能还会变,变化不频繁,但是最好能支持这种变化; · 只需要数据的持久化与反持久化的功能,不需要查询统计等复杂功能; · 存储的数据中可能包括一个或者多个的文件附件,如:word文档; · 存储的数据可能被不同的平台使用,如:windows或者linux; · 作为web项目的一部分,除了提供VC的接口之外,存储的数据格式需要提供java的接口; 我首先考虑到了MsAccess格式,文件型数据库,方便拷贝,而且表的设计很柔性化。在windows环境下,MsAccess似乎可以不需要再安装额外的驱动,但是在linux环境下,如何被java调用是个问题(当然,这个问题也是可以解决的,但是很别扭)。其次,使用RDB还有一个问题:数据的层次表达与多值问题,将树型数据扁平化存储的方案是有的,但是,将几层简单的节点拆分成N个表格,岂不是杀鸡用牛刀? 其次的考虑当然是XML,然而XML是基于可读文本的,如何解决二进制数据问题?当然可以通过编码的途径来解决,但是这样使用XML是不是太牵强了?而且,XML有个缺陷,数据都是文本型的。要使用数值型、布尔型、日期型的数据,需要做进一步的解析。 那么就使用自定义的数据文件格式?传统情况下,我们会用一个或者若干个struct将数据打包,一下子塞进文件。但是现在用户说了:我们现在定义的数据结构可能会变:) 看来,我们的存储方案还必须要足够的柔性化。 想到最后,我决定还是借鉴XML的树型标签形式,来实现一种二进制的存储结构,即BinXML:) 关于src包 对于BinXML-src里面的例子,数据的结构类似于: BinXML-src.zip包括两部分,一部分是vc的工程,一部分是java的工程,在Visual C++6.0和eclipse+JDK1.4中都已编译、运行通过。大家可以运行BinXML-bin.zip里面的exe程序,测试一下BinXML文件的加载保存功能。 对象模型 BinXML的对象模型主要包括:文档(document)和节点(node)。每个文档包含一个根节点(root),根节点下面包含一个或者多个子节点,如此类推。 文档包含一个文件头,其中包含了一些标识串、操作系统版本、文件大小、文档创建时间等信息。 每个节点也包含一个节点头,表明该节点的名称以及大小。一般来说,用户不会直接接触到文件头和节点头这些信息。 如下为VC里的类声明: 在java里,定义了binxml.io包,其中的类、接口定义与以上相似。 你很容易想到,使用BinXML,可以很方便地完成CTreeCtrl的持久化。 如何使用? 如下是VC中加载BinXML的代码片断: 对应的,写入BinXML的代码片断: 是不是很简单?在java里面,BinXML的一个测试用例: TODO 希望BinXML能给你带来一定的帮助和启发,更多的是希望能带来启发:)希望有兴趣的哥们继续完善BinXML,别忘了在你的大名之前保留我的版权信息: BinXML需要完善的地方表现在: · 暂时只实现了string/long/byte[],还没有提供其它类型的解析与转换; · XML标签不支持属性,只支持子元素:) · 是不是可以提供一个oxm模型,完成BinXML与Object之间的直接映射,现在这个映射工作还是人工代码实现的,譬如:GetString/GetLong,等等。应该可以完善一个映射机制,自动根据定义好的类型进行转换;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值