serialization - 是否有可能拦截 matlab save() 字节流

标签 serialization matlab save

在 matlab 中,可以使用 matlab save() 调用将 matlab 对象甚至整个工作区写入文件。我想拦截字节流并在它进入文件之前对其进行后处理,这可能吗?或者,是否可以指定写入字节流的文件描述符,而不是通常作为参数进入 save() 调用的文件名。

请注意,我不是在寻找在 matlab 中编写文件的替代方法,我知道我可以 fopen() 一个文件并编写我想要的任何内容,但关键是我想(重新)使用该对象保存调用内部的序列化,而不是再次发明我自己的序列化。

对于 load() 调用当然会出现一个模拟问题,但在那种情况下会在字节流进入反序列化过程之前拦截它,但我猜想 save() 是否有可能解决 load()问题自然会出现。

一些说明:

  1. 我不是在寻找序列化 matlab 数据的新方法,它已经存在并且练习的重点是在 save() 调用中使用现有的序列化,这样 1) 我不需要在较新版本的 matlab 中开始更新新类型对象的序列化代码,否则天堂禁止人们开始使用自定义 OOP 对象,并且 2) 我仍然可以轻松地使用现有代码读取 mat 文件,例如 scipy 的支持用于 mat 文件。

  2. 在后处理之前,流不得输出到文件或任何东西,这个想法是为了安全而加密,将流直接写入文件完全破坏了这个目的。

并发症:

  • 似乎save中使用的功能matlab 中的函数不仅仅是常规的顺序写入。检查库的目标代码,似乎保存功能是使用 matPutVariable 实现的(以前称为 matPutArray )写入类型为 mxArray* 的给定变量输出到类型为 MATFile* 的文件用 matOpen 打开.这里的问题是matPutVariable的描述中的以下文字:

    If the mxArray does not exist in the MAT-file, the function appends it to the end. If an mxArray with the same name exists in the file, the function replaces the existing mxArray with the new mxArray by rewriting the file.

    这意味着 matPutVariable函数将不得不遍历文件,显然使用管道时将无法进行查找,因此在使用此现有序列化功能时无法使用管道来实现我们对字节流的处理。

最佳答案

使用虚拟文件系统怎么样?在 Windows 上有一个名为 BoxedAPP SDK 的商业库,它允许您创建一个仅对创建进程可见的虚拟文件(也可能是子进程)。您可能必须制作一个 MEX 来连接库。首先,您将创建虚拟文件,然后您可以在 matlab 中使用相同文件名的保存命令。然后你可以在 matlab 中使用普通的 fopen/fread 函数读取序列化的 .mat 字节流,并用它做任何你想做的事。这至少会阻止在硬盘上创建文件。我不确定在某些情况下文件或其部分是否可以进入交换文件,因为文件实际上是在内存中创建的。

libmx 中似乎还有未记录的函数 mxSerialize 和 mxDeserialize,您可以使用它们,例如。通过直接来自 matlab 的 loadlibrary/calllib 函数或通过包装器 mex。一些谷歌搜索显示这些函数的签名应该是

mxArray* mxSerialize(const mxArray*);
mxArray* mxDeserialize(const void*, size_t);

一些测试显示 mxSerialize() 获取 matlab 变量作为参数并返回序列化字节作为 uint8 数组。 mxDeserialize() 将此 uint8 数组(第一个参数)转换回 matlab 对象作为返回值。 mxDeserialize 的第二个参数似乎是第一个参数中的元素数。尽管 TMW 可能会更改 API,但不能保证将来使用这些未记录的函数。

关于serialization - 是否有可能拦截 matlab save() 字节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4807035/

相关文章:

c - 如何保存 C 函数中读取的变量?

dart - Dart中抽象类型的反序列化

python - Django MultiValueDictKeyError 什么时候发生以及如何避免?

matlab - 使用 PCA 降维 - MATLAB

matlab - 在 MATLAB 中绘制透明线

matlab - 在 Matlab 中放大和缩小删除

python - Django REST Framework - 教程 - 困惑

java - 将 Java 枚举序列化为 XML 的最佳实践是什么?

c# - 从 Web 下载文件然后使用保存文件对话框保存?

javascript - 如何在 Photoshop JavaScript API 中加载图层透明度并另存为路径?