Int*_*per 5 matlab protocol-buffers
因此,如果想要在Matlab中使用Google协议缓冲区并使用Windows计算机,那么最好的方法是什么,因为Matlab不在支持的语言列表中?
小智 2
正如 Cameron Lowell Palmer 的回答所暗示的那样,正确的方法是通过 Java。
我今天在这个问题上浪费了几个小时,我想详细说明一下。我从卡梅伦的答案开始,但我还必须采取更多步骤。本质上,我必须执行以下所有操作:
protoc --java_out=./ your_file.protosudo apt install libprotobuf-java/usr/share/java/protobuf-3.6.1.jar; 稍后将使用其路径。名称应始终遵循模式protobuf-version.jar或protobuf-java-version.jar,因此locate protobuf- | grep jar$应减少您的搜索空间。./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)
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 版本。/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/.jar cvf ./YourProtoFilename.jar x/y/z/*.class. 请注意,此命令行适用于我,因为我已将所有类(包括 MyProto)放在同一个包中。您可能需要根据您的需求进行调整。% 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)
相同的过程也适用于八度。java inside Octave 的语法有点不同。在我的例子中,octave 对 java 版本不太挑剔。青年MMV