如何让Google Protobuf在Matlab中工作?

Int*_*per 5 matlab protocol-buffers

因此,如果想要在Matlab中使用Google协议缓冲区并使用Windows计算机,那么最好的方法是什么,因为Matlab不在支持的语言列表中?

小智 2

正如 Cameron Lowell Palmer 的回答所暗示的那样,正确的方法是通过 Java。

我今天在这个问题上浪费了几个小时,我想详细说明一下。我从卡梅伦的答案开始,但我还必须采取更多步骤。本质上,我必须执行以下所有操作:

  1. 为java编译proto消息,例如protoc --java_out=./ your_file.proto
  2. 记得安装 protobuf java 运行时,例如在 ubuntu 中:sudo apt install libprotobuf-java
  3. 在您的系统上找到 protobuf java 运行时,例如:/usr/share/java/protobuf-3.6.1.jar; 稍后将使用其路径。名称应始终遵循模式protobuf-version.jarprotobuf-java-version.jar,因此locate protobuf- | grep jar$应减少您的搜索空间。
  4. 将一个短 java 文件添加到 protobuf java 文件所在的同一目录中 ( ./x/y/z/MyProto.java)。使用您的包路径而不是x/y/z。如果您没有在 proto 文件中显式声明 java 包,那么 protoc 只会使用您的文件名作为包名称。无论哪种方式,您都可以自己检查协议生成的文件的去向。下面列出了 MyProto.java 的内容。只需用你的东西替换YourProtoFileName和即可。YourMessageName请注意,此步骤不是可选的,因为这不会生成简单的帮助程序类。对于我的生活,Matlab不会让我直接使用内部类(在java中,YourMessageName是内部类YourProtoFileName)。但有了上面的助手,很高兴为我生成它们。请注意,如果您的原型文件中定义了多个消息,则可能需要以这种方式公开多个构建器。如果您只需要读取原始缓冲区,那么您可能需要导出 justYourMessageName而不是Builder.
package x.y.z;

import x.y.z.YourProtoFileName; // if you do not know it, do `ls x.y.z/*.java`

public class MyProto {
   public static YourProtoFileName.YourMessageName.Builder newBuilder() {
      return YourProtoFileName.YourMessageName.newBuilder();
   }
}
Run Code Online (Sandbox Code Playgroud)
  1. 检查Matlab的java版本;在Matlab中编写version -java。就我而言,它是 1.8,而我的系统 ( java -version) 上安装的默认 java 是 11。我必须手动选择 java 1.8 进行下一步,否则整个过程将无法正常工作。更糟糕的是,Matlab 只产生了一个非常不起眼的错误“No class xyzYourProtoFileName”。谢谢Matlab!您可能需要先安装正确的版本 ( sudo apt install openjdk-8-jdk),然后使用update-java-alternatives或仅javac在系统上查找适当的 Java 版本。
  2. 编译您的 java 文件和 protoc 生成的文件。请记住将类路径指向您在上面找到的 jar 文件或 protobuffer 运行时。并记住使用您的 javac 路径。在单个命令中:/usr/lib/jvm/java-8-openjdk-amd64/bin/javac x.y.z/*.java -cp /usr/share/java/protobuf-3.6.1.jar. 这将生成./x/y/z/.
  3. 可选:将类文件打包到 jar 中以便于分发:jar cvf ./YourProtoFilename.jar x/y/z/*.class. 请注意,此命令行适用于我,因为我已将所有类(包括 MyProto)放在同一个包中。您可能需要根据您的需求进行调整。
  4. 启动Matlab。
% make Matlab aware of your new classes
javaaddpath('./')
% tell Matlab where protobuf dependancy lives (use the path from step 3)
javaaddpath('/usr/share/java/protobuf-3.6.1.jar')

% test if the classes were found
methods('x.y.z.YourProtoFilename.YourMessageName')
% if methods are listed then you are good to go

% use the helper form step 4
b = x.y.z.MyProto.newBuilder();
% now you have a builder you can use to build your protobuf message
Run Code Online (Sandbox Code Playgroud)
  1. 请参阅 Google 的 protobuf java prime 从这里开始,因为在 Matlab 中使用 java 相当简单:只需编写 java 语句即可。只要它们是简单的陈述:)

相同的过程也适用于八度。java inside Octave 的语法有点不同。在我的例子中,octave 对 java 版本不太挑剔。青年MMV