Project1

标题: Marshal.load(file)读取数据 順序层次的问题(纯讨论) [打印本页]

作者: TERENCE    时间: 2009-2-5 05:29
标题: Marshal.load(file)读取数据 順序层次的问题(纯讨论)
Marshal.load(file)读取数据MS有一种(順序层次的)问题
根据Marshal.dump(obj, file)存取数据的順序
如果想要读取自己想要的数据,
就必須重复读N次(的 Marshal.load(file))才能读到你想要的数据

举个例子:
RM默认脚本下的顺序是
Marshal.dump(characters, file)
Marshal.dump(Graphics.frame_count, file)
Marshal.dump($game_system, file)
Marshal.dump($game_switches, file)
Marshal.dump($game_variables, file)
Marshal.dump($game_self_switches, file)
Marshal.dump($game_screen, file)
Marshal.dump($game_actors, file)
Marshal.dump($game_party, file)
Marshal.dump($game_troop, file)
Marshal.dump($game_map, file)
Marshal.dump($game_player, file)

如果想要$game_map內的数据
就必須重复读11次(的 Marshal.load(file))才能读到
[LINE]1,#dddddd[/LINE]
问题:
有沒辦法直接跳到第N层內的数据直接读取?
作者: 沉影不器    时间: 2009-2-5 06:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: 亿万星辰    时间: 2009-2-5 06:27
从操作上来讲,如果要第11个,那么你确实是得Marshal.load 10次无用数据,所以你如果在存档处确实需要某一个特殊的数据,可以专门把它存在最前头。 [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: TERENCE    时间: 2009-2-5 06:50
那麼可利用characters = []嗎?

Scene_Save中def write_save_data(file)方法里有
# 产生描绘游戏存档用的角色图形(数组)
characters = []

可利用這个数组存东西
因為Marshal.dump(characters, file)是第一层直接被读取
????

作者: 玄月    时间: 2009-2-5 06:55
顺序问题吧……今天就跟这个在纠纷,然后最后还是屈服了- -,拿100%能读取的变量来记录。。。最简单的方法还是读取多几次无用的数据吧。 = =
作者: TERENCE    时间: 2009-2-5 07:06
以下引用玄月于2009-2-4 22:55:23的发言:

顺序问题吧……今天就跟这个在纠纷,然后最后还是屈服了- -,拿100%能读取的变量来记录。。。最简单的方法还是读取多几次无用的数据吧。 = =

你也知道
如果这麼做....读取多几次无用的数据
会导致一些刷新的時后速度会减慢的
尤其是在显示存档的地图位址名称
因為它就是在第11层內的数据

作者: 玄月    时间: 2009-2-5 07:27
除了摊手……我还能干嘛呢。存档画面的制作我告一段落了,虽说没什么功能。不过基本游戏该有的都有了。可以看章节名之类的  = =
作者: TERENCE    时间: 2009-2-5 08:19
呵呵~~
利用characters = []
可行了!!

作者: Quarcy    时间: 2009-2-5 08:48
是根據「」分割的,所以可以用split來處理
    file = File.open(dir, mode)
    Marshal.load( "" + file.read.split("")[n] )

n 由 1 開始數
作者: TERENCE    时间: 2009-2-5 08:55
以下引用Quarcy于2009-2-5 0:48:16的发言:

是根據「」分割的,所以可以用split來處理

   file = File.open(dir, mode)
   Marshal.load( "" + file.read.split("")[n] )

n 由 1 開始數

我很好奇
LS怎麼知道
是根據「」分割的??

作者: Quarcy    时间: 2009-2-5 08:59
直接用Notepad打開文件一看就知道……RM的數據根本不設防
作者: 亿万星辰    时间: 2009-2-5 15:34
以下引用TERENCE于2009-2-5 0:19:35的发言:

呵呵~~
利用characters = []
可行了!!

你新放个变量进去到最前面也可以……
作者: 玄月    时间: 2009-2-5 16:33
读取存档的时候会不会错误啊
作者: OCTSJimmy    时间: 2009-2-5 17:49
以下引用Quarcy于2009-2-5 0:48:16的发言:

是根據「」分割的,所以可以用split來處理

   file = File.open(dir, mode)
   Marshal.load( "" + file.read.split("")[n] )


n 由 1 開始數


这种方法似乎不行的吧?
因为感觉变量和开关的改变会使得存档文件的长短改变……那么一改变,鬼知道要取得哪个……

作者: TERENCE    时间: 2009-2-5 19:08
以下引用亿万星辰于2009-2-5 7:34:31的发言:


以下引用TERENCE于2009-2-5 0:19:35的发言:

呵呵~~
利用characters = []
可行了!!

你新放个变量进去到最前面也可以……
以下引用玄月于2009-2-5 8:33:10的发言:

读取存档的时候会不会错误啊

我觉得不要放新的变量(Marshal.dump(obj, file))进去比较妥当
有加新的一层的Marshal.dump(obj, file),
读档时就必须按位置新加一层Marshal.load(file),

如果在做存档转移时,会在Marshal.load(file)层次少一层容易把资料放错变量
或因为先前没有那一层资料而读取错误。

(这里说的存档转移,也代表  游戏进行到一半的存档,如果中途改了Save Load 相关脚本)
[LINE]1,#dddddd[/LINE]
如果利用characters = []
在读取,存取视窗生成角色图片的回圈范围稍加注意就可以,
如果是要显示当存档前的地图,
只要利用nil值去判断....
是否做存档转移时之前沒存到的錯誤。
作者: IamI    时间: 2009-2-5 19:17
以下引用Quarcy于2009-2-5 0:48:16的发言:

是根據「」分割的,所以可以用split來處理

   file = File.open(dir, mode)
   Marshal.load( "" + file.read.split("")[n] )


n 由 1 開始數

这个要狠狠的PIA,喵的脚本编辑器是UTF-8编码,记事本是ASCII编码,如果你把他用记事本打开,Copy进编辑器,你会发现根本就不是那么回事,而且不同类型表示不同,根本没法用
要提高效率最简单的办法就是单独提文件出来保存。

你是对的
作者: Quarcy    时间: 2009-2-5 19:34
以下引用OCTSJimmy于2009-2-5 9:49:24的发言:

这种方法似乎不行的吧?
因为感觉变量和开关的改变会使得存档文件的长短改变……那么一改变,鬼知道要取得哪个……

內容大小完全不關我事,甚至裏面有多少個元素都不關我事,我祗是根據段分割符號把數據重新分割開來,然後轉義。
以下引用IamI于2009-2-5 11:17:57的发言:

这个要狠狠的PIA,喵的脚本编辑器是UTF-8编码,记事本是ASCII编码,如果你把他用记事本打开,Copy进编辑器,你会发现根本就不是那么回事,而且不同类型表示不同,根本没法用
要提高效率最简单的办法就是单独提文件出来保存。

扶額……果然不能理解嗎?
無論甚麼碼都好,在二進制當中保持一致就可以了。你不會以為I/O還會因為編碼的差異而讀出來的東西有本質的不同吧?如果是這樣,那麼Matz的大腦真的進水了。

總之自己試一下就很清楚
作者: TERENCE    时间: 2009-2-5 20:04
LS别生气
其实你的答案是正解的了

只是在RM脚本编辑器里头显示显示很丑


昨天本来要认可你的,但是先被前面的人抢先了
SORRY啦!!

作者: TERENCE    时间: 2009-2-6 07:29
疑~~本帖得到版主鼓励!?而且还改变主题排序??


无论原因如何谢谢BZ redant 的鼓励和加分!!

作者: redant    时间: 2009-2-6 07:53
欢迎讨论有关RM的问题,你提出的问题能引起大家的积极讨论
我也受益匪浅 多谢

竖起一个拇指 也是为了让更多人来讨论
作者: 沉影不器    时间: 2009-2-6 21:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-2-6 21:32
以下引用沉影不器于2009-2-6 13:04:46的发言:

整理成函数更方便...

module Marshal
def self.read(port, sect, proc=nil)
   str = ["\004\010"].pack("a*") ### - -||
   return self.load(str + port.read.split(str)[sect+1], proc)
end
end

file = File.open("Save1.rvdata", "rb")
a=Marshal.read(file,1)
p a



[本贴由作者于 2009-2-6 13:14:51 最后编辑]

pack是什么……第一句生成了那个EOF标志吗?
作者: goahead    时间: 2009-2-6 23:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: TERENCE    时间: 2009-2-7 00:44
以下引用沉影不器于2009-2-6 13:04:46的发言:
整理成函数更方便...
module Marshal
def self.read(port, sect, proc=nil)
   str = ["\004\010"].pack("a*") ### - -||
   return self.load(str + port.read.split(str)[sect+1], proc)
end
end

file = File.open("Save1.rvdata", "rb")
a=Marshal.read(file,1)
p a

["\004\010"].pack("a*")
这句我无法理解 pack (二进制把数组转成字符串) 怎么用??

而且为甚麼是"\004\010"和"a*"
沉影 可以举个例子 或 讲解吗??

作者: 亿万星辰    时间: 2009-2-7 01:28
以下引用沉影不器于2009-2-6 13:04:46的发言:
str = ["\004\010"].pack("a*")

这……直接写"\004\010"多好……  - -|
作者: 沉影不器    时间: 2009-2-7 02:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: TERENCE    时间: 2009-2-7 03:33
以下引用沉影不器于2009-2-6 18:45:39的发言:

回TERENCE:
p "".unpack("a*")

回亿万星辰:
我也不知道,中午赶时间匆忙测试,有时候"\004\010"就得到nil...["\004\010"].pack("a*")貌似不出错...困了想睡觉去,先在这行后面注释"### - -||"

我终於知道沉影不器这样写的用意了
"".unpack("a*") 就表示["\004\010"] 而不是只有 "\004\010"
在RM里无法显示要不就显示的很丑(一般是打不出来的)
写成["\004\010"]就代表了""
作者: 亿万星辰    时间: 2009-2-7 04:26
  1. a = "\004\010"
  2. b = ["\004\010"]
  3. p a == b.pack("a*")
复制代码

嗯,是这样的。
作者: 玄月    时间: 2009-2-7 05:40
越看越晕…………已经是我看不懂的程度了
作者: 沉影不器    时间: 2009-2-8 18:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: 亿万星辰    时间: 2009-2-8 23:27
太复杂了,超出理解范畴了……
我的话还是把需要用文件专门存放在最前面好了
作者: Quarcy    时间: 2009-2-8 23:49
就是指針咩--
原本的file實例內容是這樣的:
0000000000000000000000000000000000000

read了以後變成這樣:
0000000000000000000000000000000000000
                                    ↑
如果再read的話就會這樣:
0000000000000000000000000000000000000
                                                                         ↑
因此得到nil
如果#.pos = 0的話就變為這樣:
0000000000000000000000000000000000000

于是就可以重複read
不過啊--,如果要重複使用的話,不如把split出來的數組記錄起來不是更好……?指針歸0沒有甚麼意義吧……
作者: 沉影不器    时间: 2009-2-9 04:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沉影不器    时间: 2009-2-10 03:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: 亿万星辰    时间: 2009-2-11 20:55
我的建议还是把需要在存档窗口要描述的数据单独存放与文件头部.
作者: 海阔天空    时间: 2009-2-13 21:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: 玄月    时间: 2009-2-14 21:43
看来这个话题真的很受人关注。不过如果不能很好的读取数据。那么把数据储存为一定能读取的比如变量这样的东西
作者: TERENCE    时间: 2009-6-12 08:00
以下引用Quarcy于2009-2-5 0:59:27的发言:

直接用Notepad打開文件一看就知道……RM的數據根本不設防

眼力那么地好....
我都看不出来分界在何处的(符号)说!

作者: danny8376    时间: 2009-7-2 00:00
本帖最后由 danny8376 于 2009-7-2 00:02 编辑
眼力那么地好....
我都看不出来分界在何处的(符号)说!

TERENCE 发表于 2009-6-12 08:00

Notepad在正常的模式下不認識的字會自動無視掉
用Hexedit之類的程式開會比較好

還有
這個分界符號實際上是Marshal的版本4.8
Marshal會寫在前2個字節




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1