wic*_*ich 6 matlab serialization save
在matlab中,可以使用matlab save()调用将matlab对象甚至整个工作区写入文件.我想拦截字节流并在它转到文件之前对其进行后处理,这可能吗?或者,是否可以指定写入字节流的filedescriptor而不是通常作为参数进入save()调用的文件名.
请注意,我不是在寻找另一种在matlab中编写文件的方法,我知道我可以fopen()一个文件并编写我想要的任何内容,但重点是我想(重新)使用对象序列化保存电话内部,不再发明我自己的.
load()调用当然会出现一个模拟问题,但在这种情况下,在进入反序列化过程之前拦截字节流,但我想如果save()可能会出现load()问题的解决方案.自然.
一些澄清:
我不是在寻找一种新的方法来序列化matlab数据,它已经存在并且练习的重点是在save()调用中使用现有的序列化,以便1)我不需要开始更新序列化新版本的matlab中的新类型对象的代码,或者天堂禁止人们开始使用自定义OOP对象,以及2)我仍然可以轻松地使用现有代码来读取mat文件,例如scipy对mat文件的支持.
流不得在后处理之前转到文件或任何内容,这个想法是加密安全性,将流明文写入文件完全破坏了该目的.
并发症:
似乎savematlab中函数中使用的功能不仅仅是常规顺序写入.检查库的目标代码似乎是使用matPutVariable(以前称为matPutArray)实现save函数,它将类型mxArray*out 的给定变量写入MATFile*open 类型的文件matOpen.这里的问题是以下描述中的文字matPutVariable:
如果
mxArrayMAT文件中不存在,则该函数将其追加到末尾.如果mxArray文件中存在同名,则该函数通过重写文件替换现有mxArray的newmxArray.
这意味着该matPutVariable函数必须通过该文件进行搜索,显然在使用管道时将无法进行搜索,因此在使用此现有序列化功能时,无法使用管道来实现对字节流的处理.
如何使用虚拟文件系统?在Windows上有一个名为BoxedAPP SDK的商业库,它允许您创建仅对创建过程可见的虚拟文件(也可能是子项).你可能需要制作一个MEX来连接库.首先,您将创建虚拟文件,然后您可以在matlab中使用具有相同文件名的save命令.然后你可以使用matlab中的普通fopen/fread函数读取序列化的.mat字节流,并随心所欲地执行它.这至少会阻止在硬盘上创建文件.我不确定在某些情况下文件或部分文件是否可以到达交换文件,因为文件实际上是在内存中创建的.
在libmx中似乎还有未记录的函数mxSerialize和mxDeserialize,例如.通过loadlibrary/calllib函数直接从matlab或包装器mex.一些谷歌搜索显示这些功能的签名应该是
mxArray* mxSerialize(const mxArray*);
mxArray* mxDeserialize(const void*, size_t);
Run Code Online (Sandbox Code Playgroud)
并且一些测试显示mxSerialize()获取matlab变量作为参数并返回序列化字节作为uint8数组.mxDeserialize()将此uint8数组(第一个参数)转换回matlab对象作为返回值.mxDeserialize的第二个参数似乎是第一个参数中的元素数.但是,使用这些未记录的函数不会保证将来可用,因为TMW可能会更改API.