Ruby zlib :: Gzip无法正常工作

时间:2010-09-11 05:44:39

标签: ruby xml gzip

我正在创建一个输入/导出系统,可以在xml树中编码服装数据结构,然后将其读回并重新创建对象。 我得到了xml部分工作正常但当我发现原始ruby :: Marshal文件只有105kb时xml文件是1.5mb我决定压缩文件是个好主意。 所以我这样做了

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都不包含整个系统,只包含require头和最后几行进行压缩

但是我收到了一个短语错误,因为xml文档已经损坏了一些

在我Gziped之前这是导入破坏的输出(当然记录文件是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.3mb

<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>

原始的腐败只会从这里变得更糟

澄清我运行了导入脚本并生成了文件tilesets.rmpy(18kb) 然后我运行导入来测试系统并发现了这个。

知道什么是错的?或者如果不是如何解决它,另一种选择?

1 个答案:

答案 0 :(得分: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

解决任何问题