2010-09-11 76 views
0

我正在創建一個入口/出口系統,它可以在xml樹中編碼一個服裝數據結構,然後將其讀回並重新創建對象。 我得到的XML部分工作正常,但當我發現XML文件是1.5MB時,原始的紅寶石::元帥文件只有105kb我決定,這將是一個好主意,壓縮文件。 所以我做了這個Ruby zlib :: Gzip不能正常工作

require "rexml/document" 
require "zlib" 
include REXML 

tilesetfile = File.new("tilesets.rmpy", "w+") 
buffer = "" 
tilesetgz = Zlib::GzipWriter.new(tilesetfile) 
puts "Compressing output for: tilesets.rxdata ..." 
tilesetdoc.write(buffer, 0) 
tilesetgz.write(buffer) 
tilesetgz.close 

然後我試圖讓字符串緩衝區回來,這樣我可以再次短語爲XML像這樣

require "rexml/document" 
require "zlib" 
include REXML 

tilesetfile = File.open("tilesets.rmpy", "r") 
tilesetgz = Zlib::GzipReader.new(tilesetfile) 
testfile = File.new("importtest.txt", "w") 
tilesetdoc = Document.new tilesetgz 

應該注意的是,無論這些spinets的包含整個系統,只是需要報頭和最後幾行做壓縮

但我得到一個措辭錯誤,因爲XML文檔蜜蜂破壞了一些如何

這是出把進口斯克呂普之前,我Gziped它(tracated當然該文件1.5MB畢竟)

<tilesetdata> 
<tileset> 
<id> 
1 
</id> 
<022-Roof01/> 
<tileset_name> 
019-DesertTown01 
</tileset_name> 
<autotile_names> 
<item> 
015-Sa_Water01 
</item> 
<item> 
016-Sa_Shadow01 
</item> 
<item> 
018-Sa_Ground01 
</item> 
<item> 
019-Sa_Grass02 
</item> 
<item> 
020-Sa_Grass03 
</item> 
<item> 
021-Sa_Road01 
</item> 
<item> 
022-Roof01 
</item> 
</autotile_names> 
<panorama_name> 
</panorama_name> 
<panorama_hue> 
0 
</panorama_hue> 
<fog_name> 
</fog_name> 
<fog_hue> 
0 
</fog_hue> 
<fog_opacity> 
64 
</fog_opacity> 
<fog_blend_type> 
0 
</fog_blend_type> 
<fog_zoom> 
200 
</fog_zoom> 
<fog_sx> 
0 
</fog_sx> 
<fog_sy> 
0 
</fog_sy> 
<battleback_name> 
</battleback_name> 
<passages> 
<item> 
15 
</item> 
<item> 
15 
</item> 
<item> 
15 
</item> 
<item> 
15 
</item> 
<item> 
15 
</item> 
<item> 
15 
</item> 

在進口方面我攔截了unGziped文件奇怪的是該文件是1.3 MB這時候

<tilesetdata> 
<tileset> 
<id> 
1 
</id> 
<022-Roof01/> 
<tileset_name> 
019-DesertTown01 
</tileset_name> 
<autotile_names> 
<item> 
015-Sa_Water01 
</item> 
<item> 
016-Sa_Shadow01 
</item> 
<item> 
018-Sa_Ground01 
</item> 
<item> 
019-Sa_Grass02 
</item> 
<item> 
020-Sa_Grass03 
</item> 
<item> 
021-Sa_Road01 
</item> 
<item> 
022-Roof01 
</item> 
</autotile_names> 
<panorama_name> 
</panorama_name> 
<panorama_hue> 
0 
</panorama_hue> 
<fog_name> 
</fog_name> 
<fog_hue> 
0 
</fog_hue> 
<fog_opacity> 
64 
</fog_opacity> 
<fog_blend_type> 
0 
</fog_blend_type> 
<fog_zoom> 
200 
</fog_zoom> 
<fog_sx> 
0 
</fog_sx> 
<fog_syy> 
0 
</fog_sx> 
<fog_syy> 
0 
</fog_sx> 
<fog_syy> 
0 
</fog_sx> 
<fog_syy> 
0 
</fog_sx> 
<fog_syy> 
0 
</fog_sx> 

原來的腐敗只得到從這裏

更糟澄清我跑導入腳本,它產生的(在18KB) 文件tilesets.rmpy和我跑了進口測試系統並發現了這一點。

任何想法什麼時候錯了?或者如果不是如何解決它,一個替代?

+1

也許在「RB」打開的文件用gzip ,「wb」模式,而不是「r」,「w」? – Nakilon 2010-09-11 06:20:46

+0

嗯,這似乎是工作,沒有更多的腐敗。當我找出我似乎遇到的其他問題時,我會發布更多信息 – Ryex 2010-09-11 07:14:26

回答

1

看來,Gzip已只有文件工作正常使用二進制模式打開

require "rexml/document" 
require "zlib" 
include REXML 

tilesetfile = File.new("tilesets.rmpy", "wb") 
buffer = "" 
tilesetgz = Zlib::GzipWriter.new(tilesetfile) 
puts "Compressing output for: tilesets.rxdata ..." 
tilesetdoc.write(buffer, 0) 
tilesetgz.write(buffer) 
tilesetgz.close 

require "rexml/document" 
require "zlib" 
include REXML 

tilesetfile = File.open("tilesets.rmpy", "rb") 
tilesetgz = Zlib::GzipReader.new(tilesetfile) 
tilesetdoc = Document.new tilesetgz.read.to_s 

與摸索出任何問題