C#XML与二进制相互转换
关于为什么需要转换:本人步入Game行业已经4年了,但是配置文件要麽是原生的XML文件,要麽是别人的二进制文件.关于配置文件为啥要转换成二进制文件:主要是为了保密,其次才是节省空间.但是话又说回来了,使用二进制文件的时候,获取信息,需要多一步转化过程.
再者,在一个Game项目中可能有多个配置文件,本人目前在开发的有100多个,那么打包成ini二进制是很有必要的.
来个例子:
XMLToBin : XML 与 二进制文件的相互转换
family.xml : XML文件
XMLToBin:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.IO;usingSystem.Xml.Serialization;usingSystem.Runtime.Serialization.Formatters.Binary;namespaceXmlToByte.ainy{///<summary>///XML的格式转换///</summary>publicclassXMLToBin{//publicstringa="a";privatestaticXMLToBininstance;publicstaticXMLToBinInstance{get{if(XMLToBin.instance==null){XMLToBin.instance=newXMLToBin();}returnXMLToBin.instance;}set{XMLToBin.instance=value;}}publicXMLToBin(){if(XMLToBin.instance!=null){InstanceNoInstantiationExceptionexp=newInstanceNoInstantiationException(typeof(XMLToBin));Console.WriteLine(exp.Message);throwexp;}else{XMLToBin.instance=this;}}///<summary>///ObjecttoXML///</summary>///<typeparamname="T"></typeparam>///<paramname="obj"></param>///<paramname="path"></param>///<returns></returns>publicboolSerializer<T>(objectobj,stringpath){FileStreamxmlfile=newFileStream(path,FileMode.OpenOrCreate);//创建序列化对象XmlSerializerxml=newXmlSerializer(typeof(T));try{//序列化对象xml.Serialize(xmlfile,obj);xmlfile.Close();}catch(InvalidOperationException){throw;}returntrue;}///<summary>///XMLtoObject///</summary>///<typeparamname="T"></typeparam>///<paramname="path"></param>///<returns></returns>publicstaticTDeserializer<T>(stringpath){try{FileStreamxmlfile=newFileStream(path,FileMode.Open);XmlSerializerxml=newXmlSerializer(typeof(T));Tt=(T)xml.Deserialize(xmlfile);xmlfile.Close();returnt;}catch(InvalidOperationException){throw;}catch(FileNotFoundException){throw;}finally{}}///<summary>///ObjecttoBin///</summary>///<paramname="obj"></param>///<paramname="path"></param>///<returns></returns>publicboolBinarySerializer(objectobj,stringpath){FileStreamStream=newFileStream(path,FileMode.OpenOrCreate);//创建序列化对象BinaryFormatterbin=newBinaryFormatter();try{//序列化对象bin.Serialize(Stream,obj);Stream.Close();}catch(InvalidOperationException){throw;}returntrue;}///<summary>///BintoObject///</summary>///<typeparamname="T"></typeparam>///<paramname="path"></param>///<returns></returns>publicTBinaryDeserializer<T>(stringpath){try{FileStreambinfile=newFileStream(path,FileMode.Open);BinaryFormatterbin=newBinaryFormatter();//序列化对象//xmlfile.Close();Tt=(T)bin.Deserialize(binfile);binfile.Close();returnt;}catch(InvalidOperationException){throw;}catch(FileNotFoundException){throw;}finally{}}///<summary>///读取文本///</summary>///<paramname="targetPath"></param>///<returns></returns>publicstringReadCommon(stringtargetPath){if(File.Exists(targetPath)){//using(StreamReadersr=File.OpenText(targetPath))//读中文将乱码stringbcStr="";using(StreamReadersr=newStreamReader(targetPath,UnicodeEncoding.GetEncoding("GB2312")))//解决中文乱码问题{stringreadStr;while((readStr=sr.ReadLine())!=null){bcStr=bcStr+readStr;}sr.Close();}returnbcStr;}else{Console.WriteLine("Message,没有找到文件{0}",targetPath);returnstring.Empty;}}}}
family.xml:
<?xmlversion="1.0"encoding="utf-8"?><people><husband><attributename="胡Ainy"age="26"></attribute></husband><wife><attributename="snow"age="24"></attribute></wife><daughter><attributename="ms"age="1"></attribute></daughter></people>
测试:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingXmlToByte.ainy;namespaceXmlToByte{classProgram{staticvoidMain(string[]args){stringxml=XMLToBin.Instance.ReadCommon("../../res/family.xml");Console.WriteLine("family.xml:{0}",xml);Console.WriteLine("Message--转换成二进制文件成功:{0}",XMLToBin.Instance.BinarySerializer(xml,"../../res/family.ini"));//stringjson="{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"));stringaXml=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
如果读者有更好的方法,请不灵赐教.
附件:http://down.51cto.com/data/2367316声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。