C#XML与二进制相互转换

关于为什么需要转换:本人步入Game行业已经4年了,但是配置文件要麽是原生的XML文件,要麽是别人的二进制文件.关于配置文件为啥要转换成二进制文件:主要是为了保密,其次才是节省空间.但是话又说回来了,使用二进制文件的时候,获取信息,需要多一步转化过程.

再者,在一个Game项目中可能有多个配置文件,本人目前在开发的有100多个,那么打包成ini二进制是很有必要的.

来个例子:

XMLToBin : XML 与 二进制文件的相互转换

family.xml : XML文件

XMLToBin:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace XmlToByte.ainy
{
    /// <summary>
    /// XML的格式转换
    /// </summary>
    public class XMLToBin
    {
        //public string a = "a";
        private static XMLToBin instance;

        public static XMLToBin Instance
        {
            get {
                if (XMLToBin.instance == null) {
                    XMLToBin.instance = new XMLToBin();
                }
                return XMLToBin.instance; 
            }
            set { XMLToBin.instance = value; }
        }
        public XMLToBin()
        {
            if (XMLToBin.instance != null)
            {
                InstanceNoInstantiationException exp =  new InstanceNoInstantiationException(typeof(XMLToBin));
                Console.WriteLine( exp.Message);
                throw exp;
            }
            else
            {
                XMLToBin.instance = this;
            }
        }
        /// <summary>
        /// Object to XML
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public bool Serializer<T>(object obj, string path)
        {
            FileStream xmlfile = new FileStream(path, FileMode.OpenOrCreate);

            //创建序列化对象 
            XmlSerializer xml = new XmlSerializer(typeof(T));
            try
            {    //序列化对象
                xml.Serialize(xmlfile, obj);
                xmlfile.Close();
            }
            catch (InvalidOperationException)
            {
                throw;
            }

            return true;

        }
        /// <summary>
        /// XML to Object
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="path"></param>
        /// <returns></returns>
        public static T Deserializer<T>(string path)
        {
            try
            {
                FileStream xmlfile = new FileStream(path, FileMode.Open);
                XmlSerializer xml = new XmlSerializer(typeof(T));
                T t = (T)xml.Deserialize(xmlfile);
                xmlfile.Close();
                return t;
            }
            catch (InvalidOperationException)
            {
                throw;
            }
            catch (FileNotFoundException)
            { throw; }
            finally
            {

            }
        }
        /// <summary>
        /// Object to Bin
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public bool BinarySerializer(object obj, string path)
        {
            FileStream Stream = new FileStream(path, FileMode.OpenOrCreate);
            //创建序列化对象 
            BinaryFormatter bin = new BinaryFormatter();
            try
            {    //序列化对象
                bin.Serialize(Stream, obj);
                Stream.Close();
            }
            catch (InvalidOperationException)
            {
                throw;
            }
            return true;
        }
        /// <summary>
        /// Bin to Object
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="path"></param>
        /// <returns></returns>
        public T BinaryDeserializer<T>(string path)
        {
            try
            {
                FileStream binfile = new FileStream(path, FileMode.Open);

                BinaryFormatter bin = new BinaryFormatter();
                //序列化对象
                //xmlfile.Close();
                T t = (T)bin.Deserialize(binfile);
                binfile.Close();
                return t;
            }
            catch (InvalidOperationException)
            {
                throw;
            }
            catch (FileNotFoundException)
            { throw; }
            finally
            {

            }
        }
        /// <summary>
        /// 读取文本
        /// </summary>
        /// <param name="targetPath"></param>
        /// <returns></returns>
        public string ReadCommon(string targetPath)
        {
            if (File.Exists(targetPath))
            {
                //using (StreamReader sr = File.OpenText(targetPath)) // 读中文将乱码
                string bcStr = "";
                using (StreamReader sr = new StreamReader(targetPath, UnicodeEncoding.GetEncoding("GB2312"))) // 解决中文乱码问题
                {
                    string readStr;
                    while ((readStr = sr.ReadLine()) != null)
                    {
                        bcStr = bcStr + readStr;
                    }
                    sr.Close();
                }
                return bcStr;
            }
            else
            {
                Console.WriteLine("Message , 没有找到文件{0}", targetPath);
                return string.Empty;
            }
        }
    }
}

family.xml:

<?xml version="1.0" encoding="utf-8" ?>
<people>
  <husband>
    <attribute name ="胡Ainy" age ="26" ></attribute>
  </husband>
  <wife>
    <attribute name ="snow" age="24"></attribute>
  </wife>
  <daughter>
    <attribute name ="ms" age="1"></attribute>
  </daughter>
</people>

测试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XmlToByte.ainy;

namespace XmlToByte
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml = XMLToBin.Instance.ReadCommon("../../res/family.xml");
            Console.WriteLine("family.xml : {0}", xml);
            Console.WriteLine("Message -- 转换成二进制文件成功:{0}", XMLToBin.Instance.BinarySerializer(xml, "../../res/family.ini"));
            //string json = "{peopel={ [ husband={ name=\"ainy\" , age = \"26\" }, wife={ name=\"snow\" , age = \"24\" } ] }}";
            //Console.WriteLine("Message -- 转换成二进制文件成功:{0}", XMLToBin.Instance.BinarySerializer(json, "../../res/familyJson.ini"));
            Console.WriteLine("family.ini : {0}", XMLToBin.Instance.ReadCommon("../../res/family.ini"));
            string aXml = XMLToBin.Instance.BinaryDeserializer<string>("../../res/family.ini");
            Console.WriteLine("Message -- 转换成文本文件成功:{0}",aXml );
            Console.ReadKey();
        }
    }
}

注意到:其实Json和XML都可以.结果:

看结果,中文的话都改变了,英文还隐隐约约看得到配置信息.目前就这样了,毕竟中国游戏配置一大片都是中文的.另外还要感谢万能的技术论坛,一部分代码是看来自:http://www.cnblogs.com/jesszhu/archive/2013/08/22/3276556.html

如果读者有更好的方法,请不灵赐教.

时间: 2024-10-23 12:11:39

C#XML与二进制相互转换的相关文章

XML 序列化 二进制 反序列化 回来

InitializeComponent(); List<WswModel> ListModel = new List<WswModel>(); string FilePath = @"../../XML/UserAddDelectUpdate.xml"; string FilePathBin = @"wsw.wsw"; XmlDocument XmlDoc = new XmlDocument(); BinaryFormatter binary

js 位运算符 以及 心算十进制二进制相互转换

位运算符 |(或) 运算 有1即为1,双0才为0 1 31| 2 = 11111 | 10 = 11111 = 3 2 3 | 4 = 11 | 100 = 111 = 7 3 6 | 7 = 110 | 111 = 111 = 7 4 10 | 9 = 1010 | 1001 = 1011 = 11 &(与) 运算 有0即为0,双1才为1 1 31 & 2 = 11111 & 10 = 00010 = 2 2 3 & 4 = 11 & 100 = 000 = 0

javacript 十进制与二进制相互转换

a.十进制数转换为二进制数 var a = 302; console.log(a.toString(2)); b.二进制转换为十进制 var b = 1010111; console.log(parseInt(b,2));

java图片二进制相互转换

import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encode

【转载】xml与String相互转换

在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化的XML Document.这就涉及到XML字符串和Xml Document的转换问题,说白了这是个非常简单的问题,本文就各种XML解析器分别列举如下,以方便自己今后查阅. 一.使用最原始的javax.xml.parsers,标准的jdk api // 字符串转XMLString xmlStr = \"......\";StringReader sr = new StringReader(xmlStr); Input

XML和DataTable相互转换

//XML转DataSet public static void XmlToDataTableByFile(){ XmlDocument doc = new XmlDocument(); doc.Load(@"E:\\xmlsample.xml"); DataSet ds = new DataSet(); StringReader tr = new StringReader(doc.InnerXml); //DataTable也可以ReadXml() ds.ReadXml(tr); }

XStream--java对象与xml形式文件相互转换

1.pom.xml中添加依赖 <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.7</version> </dependency> 2.创建xmlUtil类,并对XStream配置 2.1 解决双下划线:XStream把对象中的属性如person_name转

JAVA 实现XML与JSON 相互转换

原文地址https://blog.csdn.net/congcong68/article/details/39029907 在工作中,经常碰到XML转为JSON或者JSON转为XML,在这过程中有时嵌套很多层,容易错误,我把实现的代码分享出来,希望对有用到的人提供借鉴.    1.把XML转为JSON格式 [java] view plain copy <span style="font-size:18px;">@SuppressWarnings("rawtypes

Python 含小数的十、二进制相互转换问题

1 ''' 2 二进制->十进制:bTod 3 整数部分:a乘以2的n次方(n:a后面的整数位数) 4 小数部分:a乘以2的-n次方(n:a是小数点后几位) 5 十进制->二进制dTob 6 整数部分:短除法(除二取余法,逆序输出) 7 小数部分:乘二取整法,0.--正向输出所得 8 9 函数中形参n为字符串类型 10 ''' 11 #二进制->十进制 12 def bTod(n, pre = 4): 13 s_int = n 14 s_float = '' 15 total_int,