配置表解包(二)

public static void UnBuild()
{
    byte[] bytes = Qingame.Utils.FileUtil.ReadAllBytes(PersistentAssetPath.ConfigZipFile);
    string url = HotVersionURL.GetServerVersionUrl();
    string versionXml = File.ReadAllText(StreamingAssetPath.VersionXmlFile);
    XmlReader xr = XmlUtil.CreateXmlReader(versionXml);
    xr.Read();
    string clientVersion = xr.GetAttribute("version");
    int[] clientVersionArray = StringExtend.ToIntArray(clientVersion, CharConstants.Dot);
    int clientRepairVersion;
    int clientNoneRepairVersion;
    int.TryParse(xr.GetAttribute("rv"), out clientRepairVersion);
    int.TryParse(xr.GetAttribute("nrv"), out clientNoneRepairVersion);

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    request.Method = "GET";
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    using (Stream stream = response.GetResponseStream())
    {
        using (BinaryReader reader = new BinaryReader(stream, Encoding.UTF8))
        {
            byte[] text = reader.ReadBytes((int)response.ContentLength);
            string json = ZipUtil.UnGZipBytesToUTFString(text);
            Hashtable table = JsonUtil.jsonDecode(json) as Hashtable;
            Hashtable rootNode = table["root"] as Hashtable;
            string serverVersion = Convert.ToString(rootNode["version"]);
            int serverRepairVersion;
            int serverNoneRepairVersion;
            int.TryParse(Convert.ToString(rootNode["rv"]), out serverRepairVersion);
            int.TryParse(Convert.ToString(rootNode["nrv"]), out serverNoneRepairVersion);
            int[] serverVersionArray = StringExtend.ToIntArray(serverVersion, CharConstants.Dot);
            string configVersion = Convert.ToString(rootNode["cv"]);
            string configTestVersion = Convert.ToString(rootNode["ctv"]);
            string configNewVersion = Convert.ToString(rootNode["ctv_new"]);
            bool isNewClient = VersionUtil.CompareForce(clientVersionArray, serverVersionArray);
            if (isNewClient == false)
            {
                isNewClient = clientRepairVersion > serverRepairVersion;
                if (isNewClient == false)
                {
                    isNewClient = clientNoneRepairVersion > serverNoneRepairVersion;
                }
            }
            //是否是測試版
            bool isClientTest = StringExtend.ToBool(xr.GetAttribute("debug")) ? true : isNewClient;
            string version = isNewClient ? configNewVersion : (isClientTest ? configTestVersion : configVersion);
            bytes = EncryptUtil.Decrypt(bytes, version);
        }
    }

    Dictionary<string, byte[]> files = ZipUtil.UnZipBytesToFiles(bytes);
    XmlDocument xmlDoc = new XmlDocument();
    foreach (var pair in files)
    {
        if (pair.Key.EndsWith(AssetSuffixName.BS))
        {
            string file = GameAssetPath.Config + "/" + pair.Key.Replace(AssetSuffixName.BS, AssetSuffixName.XML);
            string content = ConfigUtil.ByteStreamToXml(pair.Value, "bs", Path.GetFileNameWithoutExtension(pair.Key));
            content = content.Replace("&", "&amp;");
            xmlDoc.LoadXml(content);

            using (XmlTextWriter writer = new XmlTextWriter(file, Encoding.UTF8))
            {
                writer.Formatting = Formatting.Indented;
                writer.Indentation = 4;
                xmlDoc.WriteTo(writer);
            }
        }
        else if (pair.Key.EndsWith(AssetSuffixName.XML))
        {
            string file = GameAssetPath.Config + "/" + pair.Key;
            string content = Encoding.UTF8.GetString(pair.Value);
            content = content.Replace("&", "&amp;");
            xmlDoc.LoadXml(content);
        
            using (XmlTextWriter writer = new XmlTextWriter(file, Encoding.UTF8))
            {
                writer.Formatting = Formatting.Indented;
                writer.Indentation = 4;
                xmlDoc.WriteTo(writer);
            }
        }
        else
        {
            //c2s.txt, s2c.txt, *.*
            string file = GameAssetPath.Config + "/" + pair.Key;
            File.WriteAllBytes(file, pair.Value);
        }
    }

    AssetDatabase.SaveAssets();
    AssetDatabase.Refresh();
}

格式化XML文件,下面的例子可能不太恰當(dāng),但是能說明問題。sb能存儲XML格式化之后的字符。

public static void FormatConfig()
{
    string[] paths = Directory.GetFiles(GameAssetPath.Config, "*.xml", SearchOption.AllDirectories);
    XmlDocument doc = new XmlDocument();
    foreach (string file in paths)
    {
        doc.Load(file);
        StringBuilder sb = new StringBuilder();
        using (XmlTextWriter writer = new XmlTextWriter(new StringWriter(sb)))
        {
            writer.Formatting = Formatting.Indented;
            writer.Indentation = 4;
            doc.WriteTo(writer);
        }

        using (XmlTextWriter writer = new XmlTextWriter(file, Encoding.UTF8))
        {
            writer.WriteRaw(sb.ToString());
        }
    }

    AssetDatabase.SaveAssets();
    AssetDatabase.Refresh();
}

只是存儲的話可以下面這么寫。

public static void FormatConfig()
{
    string[] paths = Directory.GetFiles(GameAssetPath.Config, "*.xml", SearchOption.AllDirectories);
    XmlDocument doc = new XmlDocument();
    foreach (string file in paths)
    {
        doc.Load(file);
        StringBuilder sb = new StringBuilder();
        using (XmlTextWriter writer = new XmlTextWriter(file, Encoding.UTF8))
        {
            writer.Formatting = Formatting.Indented;
            writer.Indentation = 4;
            doc.WriteTo(writer);
        }

    AssetDatabase.SaveAssets();
    AssetDatabase.Refresh();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 注:本翻譯使用符號「」來突出某些可能會產(chǎn)生歧義的名詞。目前狀態(tài):勘誤中。 Unicode?標(biāo)準(zhǔn)附錄#9 UNICO...
    Eriice閱讀 2,125評論 0 1
  • Lisp的本質(zhì) - climbdream的個人空間 - 開源中國社區(qū)https://my.oschina.net/...
    葡萄喃喃囈語閱讀 714評論 0 10
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,571評論 0 4
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,833評論 0 11
  • feisky云計算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,897評論 0 5