【发布时间】:2011-06-15 23:24:46
【问题描述】:
在 matlab 中,可以使用 matlab save() 调用将 matlab 对象甚至整个工作区写入文件。我想拦截字节流并在它进入文件之前对其进行后处理,这可能吗?或者,是否可以指定写入字节流的文件描述符,而不是通常作为参数进入 save() 调用的文件名。
请注意,我不是在寻找在 matlab 中编写文件的替代方法,我知道我可以 fopen() 一个文件并编写我想要的任何内容,但重点是我想(重新)使用该对象保存调用内部的序列化,不要再发明我自己的了。
load() 调用当然会出现一个模拟问题,但在这种情况下,在字节流进入反序列化过程之前拦截它,但我想 save() 是否有可能解决 load()问题自然会出现。
一些澄清:
我不是在寻找序列化 matlab 数据的新方法,它已经存在,练习的重点是在 save() 调用中使用现有的序列化,以便 1) 我不需要开始更新新版本的matlab中新类型对象的序列化代码,或者天堂禁止人们开始使用自定义OOP对象,2)我仍然可以轻松使用现有代码读取mat文件,例如scipy的支持用于 mat 文件。
在后处理之前,流不能输出到文件或任何东西,这个想法是为了安全而加密,将流直接写入文件完全破坏了这个目的。
并发症:
-
matlab 中
save函数中使用的功能似乎不仅仅是常规的顺序写入。检查库的目标代码,似乎保存函数是使用matPutVariable(以前称为matPutArray)实现的,它将mxArray*类型的给定变量写入MATFile*类型的文件,用matOpen打开.这里的问题是matPutVariable的描述中的如下文字:如果
mxArray不存在于 MAT 文件中,该函数会将其附加到末尾。如果文件中存在同名的mxArray,该函数通过重写文件将现有的mxArray替换为新的mxArray。这意味着
matPutVariable函数必须在文件中进行查找,显然使用管道时无法进行查找,因此在使用现有的序列化功能时,无法使用管道来实现我们对字节流的处理。
【问题讨论】:
-
您到底想完成什么?您是要对数据进行后处理,然后让它继续写入文件,还是要对其进行后处理并将其定向到其他地方?
-
@gnovice 如果后处理的字节流进入文件会很好,但如果我可以重定向字节流(未后处理),我可以将它定向到后处理设施。所以简而言之,我要么想对字节流内联进行后处理,要么我想重定向未后处理的字节流。
-
您始终可以只使用默认的 SAVE 行为,然后使用 FREAD 将创建的文件作为字节流读取..
-
@Amro 不行,关键是在它到达任何地方之前对其进行后处理。
标签: serialization matlab save