在macOS上使用Protobuff

0x00 什么是Protocol Buffers?

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

你可以理解为Protocol Buffers就是用来替代我们常见的json&xml等数据交换格式的。

pb优点:

◇性能好 / 效率高
◇代码生成机制 – 这个后面说
◇支持 “向后兼容” 和 “向前兼容”
◇支持多种编程语言

Protobuf 的不足:

◇Protbuf 与 XML 相比也有不足之处。它功能简单,无法用来表示复杂的概念。
◇XML 已经成为多种行业标准的编写工具,Protobuf 只是 Google 公司内部使用的工具,在通用性上还差很多。

0x01 macOS安装Protocol Buffers

brew install protobuf

0x02 使用 ProtoBuf

使用Protobuf有如下几个步骤:

  • 定义消息
  • 初始化消息以及存储传输消息
  • 读取消息并解析

git上的此项目,为例来进行说明:

第一步,创建 .proto 文件,定义数据结构,如下所示:

syntax = "proto2";

package lm;
message helloworld
{
    required int32 id=1;
    optional string str=2;
    enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
      }
    message PhoneNumber {
        optional string number = 1;
        optional PhoneType type = 2;
      }
    repeated PhoneNumber phones = 4;
}

关于 proto2 定义 message 消息的更多语法细节,例如具有支持哪些类型,字段编号分配、import
导入定义,reserved 保留字段等知识请参阅 [翻译] ProtoBuf 官方文档(二)- 语法指引(proto2)。

第二步,protoc 编译 .proto 文件生成读写接口

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/hello.proto
  • -I: 是设定源路径
  • –cpp_out: 用于设定编译后的输出结果,如果使用其它语言请使用对应语言
  • option 最后一个参数是你要编译的proto源文件

使用该命令会在同级目录下生成pb.cc和pb.h文件

-rw-r--r--  1 tesi1a  staff   27616  7 22 01:35 hello.pb.cc
-rw-r--r--  1 tesi1a  staff   31257  7 22 01:35 hello.pb.h

已经定义好了消息的数据结构,接下来看下如何使用。

第三步,调用接口实现序列化、反序列化以及读写

#include "hello.pb.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
bool writeBuf(string file_path)
{
    lm::helloworld msg1;
    lm::helloworld::PhoneNumber *phone;
    msg1.set_id(100);
    msg1.set_str("200");

    phone = msg1.add_phones();
    phone->set_number("12345");
    phone->set_type(lm::helloworld_PhoneType_HOME);


    fstream output(file_path, ios::out | ios::trunc | ios::binary);

    if (!msg1.SerializeToOstream(&output)) {
        cerr << "Failed to write msg." << endl;
        return false;
    }
    return true;
}

void ListMsg(const lm::helloworld & msg) {
    cout << msg.id() << endl;
    cout << msg.str() << endl;
    for (int i =0; i<msg.phones_size(); i++)
    {

        cout << msg.phones(i).number() << endl;
    }
}


bool readBuf(string file_path)
{
    lm::helloworld msg1;
    {
        fstream input(file_path, ios::in | ios::binary);
        if (!msg1.ParseFromIstream(&input)) {
            cerr << "Failed to parse address book." << endl;
            return -1;
        }
    }
    ListMsg(msg1);
}

int main()
{
    string path = "./test_data.log";
    writeBuf(path);//消息初始化和存储传输
    readBuf(path);//消息读取与解析
    return 0;
}

会在同级目录下生成test_data.log

0x03 protobuf 还原

其中protobuf还原可使用protoc --decode_raw

protoc  --decode_raw <  /test_data.log
1: 100
2: "test"
4 {
  1: "12345678"
  2: 1
}

proto还原规则及更多细致数据解析:https://blog.csdn.net/yeyiqun/article/details/99310350

0x04 参考:

python版本:https://www.jianshu.com/p/b723053a86a6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在MacOS使用Java8做本地通知需要使用JavaFX。 首先,确保你已经安装了Java8。然后,使用以下步骤进行操作: 1. 在Eclipse中新建一个JavaFX项目。 2. 在`Main`类中加入以下代码: ``` import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.GridPane; import javafx.scene.text.Text; import javafx.stage.Stage; import javafx.stage.StageStyle; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("JavaFX Local Notification Example"); primaryStage.initStyle(StageStyle.UNDECORATED); GridPane grid = new GridPane(); grid.setAlignment(Pos.CENTER); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(25, 25, 25, 25)); Button btn = new Button(); btn.setText("Show Notification"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { showNotification(); } }); grid.add(btn, 0, 1); Scene scene = new Scene(grid, 300, 275); primaryStage.setScene(scene); primaryStage.show(); } private void showNotification() { TrayNotification tray = new TrayNotification(); tray.setTitle("Notification"); tray.setMessage("This is a local notification."); tray.setNotificationType(NotificationType.SUCCESS); tray.showAndWait(); } } ``` 3. 运行项目,点击“Show Notification”按钮,即可看到本地通知。 注意:你可能需要导入TrayNotification类,它可以在这里获取:https://github.com/PureElegance/TrayNotification 希望这对你有帮助! ### 回答2: 要在MacOS使用Java 8做本地通知,你可以使用Java的桌面通知功能和MacOS的通知中心。 首先,你需要确保你的MacOS版本支持桌面通知。从MacOS 10.8开始,Apple引入了桌面通知功能,并在通知中心中进行管理。 然后,你需要创建一个Java应用程序,并添加依赖项以使用Java的桌面通知功能。你可以在你的项目中添加javax.swing和java.awt包,它们提供了创建用户界面所需的类和方法。 接下来,你需要编写代码以创建和发送通知。你可以使用Java的javax.swing.JOptionPane类来创建一个简单的弹窗,然后使用java.awt包中的Toolkit类将其转换为通知。 下面是一个简单示例代码: ```java import javax.swing.JOptionPane; import java.awt.Toolkit; public class NotificationExample { public static void main(String[] args) { // 创建一个弹窗 JOptionPane.showMessageDialog(null, "这是一个通知"); // 将弹窗转换为通知 Toolkit.getDefaultToolkit().beep(); } } ``` 编译和运行这个代码后,你会在你的MacOS上收到一个简单的通知。你也可以根据你的需要添加更多的功能,比如自定义通知标题、内容和图标等。 总结来说,要在MacOS使用Java 8做本地通知,你需要确保你的MacOS版本支持桌面通知,并在你的Java应用程序中添加依赖项以使用Java的桌面通知功能。然后,你可以使用Java的弹窗功能和MacOS的通知中心来创建和发送通知。 ### 回答3: 在MacOS使用Java8进行本地通知有以下几个步骤: 1. 确保已经安装了Java开发工具,可以在终端中运行`java -version`命令来验证是否安装。如果没有安装,你可以去Oracle官网下载并安装最新的Java8版本。 2. 创建一个Java项目,可以使用任何喜欢的IDE(比如IntelliJ IDEA)或者纯文本编辑器。在项目中创建一个Java类作为入口点。 3. 导入所需的Java库以进行本地通知。Java提供了`java.awt`和`javax.swing`库来处理图形界面,可以使用这些库来创建通知窗口。 4. 在Java类中,创建一个通知窗口的方法。可以使用`JFrame`类来创建一个可自定义的窗口,其中包括通知的标题、内容和图标。样例代码如下: ```java import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; import javax.swing.JLabel; public class Notification { public static void showNotification(String title, String message) { JFrame frame = new JFrame(); frame.setSize(400, 200); // 设置通知窗口的大小 frame.setTitle(title); // 设置通知的标题 // 获取屏幕尺寸 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int screenWidth = (int) screenSize.getWidth(); int screenHeight = (int) screenSize.getHeight(); // 设置窗口的位置居中显示在屏幕上 frame.setLocation((screenWidth - frame.getWidth()) / 2, (screenHeight - frame.getHeight()) / 2); // 设置窗口不可调整大小 frame.setResizable(false); // 在窗口中添加通知内容 JLabel label = new JLabel(message); frame.add(label); frame.setVisible(true); } } ``` 5. 在项目的其他部分调用`showNotification()`方法来显示通知窗口。在调用时,传入通知窗口的标题和内容。例如: ```java public class Main { public static void main(String[] args) { Notification.showNotification("通知标题", "这是一条通知消息!"); } } ``` 这样,当你运行该Java程序时,就会在屏幕中央显示一个具有指定标题和内容的通知窗口。你可以根据需要对窗口进行自定义,比如添加更多的组件或者调整窗口的样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值