国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【rust/egui】(三)看看template的app.rs:序列化、持久化存儲

這篇具有很好參考價(jià)值的文章主要介紹了【rust/egui】(三)看看template的app.rs:序列化、持久化存儲。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

說在前面

  • rust新手,egui沒啥找到啥教程,這里自己記錄下學(xué)習(xí)過程
  • 環(huán)境:windows11 22H2
  • rust版本:rustc 1.71.1
  • egui版本:0.22.0
  • eframe版本:0.22.0
  • 上一篇:這里

serde

  • app.rs中首先定義了我們的TemplateApp結(jié)構(gòu)體
    /// 繼承序列化以及反序列化 用于存儲一些狀態(tài)數(shù)據(jù)
    #[derive(serde::Deserialize, serde::Serialize)]
    #[serde(default)] // 在反序列化時(shí),缺少的字段會使用Default特征對應(yīng)的值進(jìn)行初始化
    pub struct TemplateApp {
        // Example stuff:
        label: String,
    
        // 聲明該字段跳過序列化
        #[serde(skip)]
        value: f32,
    }
    // 為TemplateApp實(shí)現(xiàn)Default特征
    impl Default for TemplateApp {
        fn default() -> Self {
            Self {
                // Example stuff:
                label: "Hello World!".to_owned(),
                value: 2.7,
            }
        }
    }
    
  • 在定義TemplateApp時(shí),我們讓其繼承了serde::Deserialize, serde::Serialize。serde是rust中用于序列化和反序列化(serialize and deserialize)一個(gè)框架。詳細(xì)見這里
  • eframe中,我們使用的是ron提供的序列化實(shí)現(xiàn),與json類似,但并不一致,例如以下是一個(gè)ron序列化的結(jié)果:
    Scene( // class name is optional
        materials: { // this is a map
            "metal": (
                reflectivity: 1.0,
            ),
            "plastic": (
                reflectivity: 0.5,
            ),
        },
        entities: [ // this is an array
            (
                name: "hero",
                material: "metal",
            ),
            (
                name: "monster",
                material: "plastic",
            ),
        ],
    )
    
    詳細(xì)請參考https://github.com/ron-rs/ron
  • 看一個(gè)簡單的ron序列化例子
    use serde::{Deserialize, Serialize};
    
    #[derive(Debug, Deserialize, Serialize)]
    struct MyStruct {
        boolean: bool,
        float: f32,
    }
    
    impl MyStruct {
        fn new() -> Self {
            return ron::from_str("(boolean: true, float: 1.23)").unwrap();
        }
    }
    
    fn main() {
        let x = MyStruct::new();
        println!("RON: {}", ron::to_string(&x).unwrap());
    }
    // output:
    // RON: (boolean:true,float:1.23)
    
  • 關(guān)于更深層次的內(nèi)容這里就不再展開了 (咱也展開不下去) 。

持久化存儲

  • 有了serde之后我們可以干什么呢?讓我們繼續(xù)看代碼:
    impl TemplateApp {
        /// 在第一幀之前調(diào)用
        pub fn new(cc: &eframe::CreationContext<'_>) -> Self {
            // 我們也可以在這里定義我們的界面樣式 使用`cc.egui_ctx.set_visuals` and `cc.egui_ctx.set_fonts`.
            
            // 加載一些應(yīng)用狀態(tài)(比如上一次打開了那些文件之類的) 但是我們必須啟用`persistence`特性
            if let Some(storage) = cc.storage {
            	// 這里我們使用ron取出存入的狀態(tài)數(shù)據(jù) 并將其反序列化成TemplateApp
                return eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default();
            }
        
            Default::default()
        }
    }
    
    impl eframe::App for TemplateApp {
        /// 在應(yīng)用關(guān)閉前調(diào)用 用于存儲狀態(tài)
        fn save(&mut self, storage: &mut dyn eframe::Storage) {
        	// 這里我們使用ron將TemplateApp序列化 并且存入對應(yīng)的文件中
            eframe::set_value(storage, eframe::APP_KEY, self);
        }
    
  • 首先我們?yōu)?code>TemplateApp實(shí)現(xiàn)了new方法
  • 而在之前的main.rs中,我們可以看到該方法的調(diào)用,實(shí)際上,該函數(shù)是在eframe的各種準(zhǔn)備工作完成后,才進(jìn)行的回調(diào)
    eframe::run_native(
            "demo app",
            native_options,
            Box::new(|cc| Box::new(demo_app::TemplateApp::new(cc))),
        )
    
  • 在該函數(shù)中,我們完成了一些狀態(tài)數(shù)據(jù)的還原,即讀取應(yīng)用上一次的工作狀態(tài),那么這些數(shù)據(jù)又是在什么時(shí)候存儲下來的呢?以及存在了哪里呢?
  • 在接下來的代碼中,我們實(shí)現(xiàn)了eframe::App特征,在save方法中,我們對狀態(tài)數(shù)據(jù)進(jìn)行了存儲,我們可以看看eframe::set_value的具體實(shí)現(xiàn):
    #[cfg(feature = "ron")]
    pub fn set_value<T: serde::Serialize>(storage: &mut dyn Storage, key: &str, value: &T) {
    	// 首先對TemplateApp進(jìn)行序列化
        match ron::ser::to_string(value) {
        	// 如果序列化成功 那么進(jìn)一步進(jìn)行存儲 這里并不會立即寫文件
            Ok(string) => storage.set_string(key, string),
            // 失敗則打印日志
            Err(err) => log::error!("eframe failed to encode data using ron: {}", err),
        }
    }
    
  • 我們可以運(yùn)行一下應(yīng)用看看效果,先修改輸入:
    【rust/egui】(三)看看template的app.rs:序列化、持久化存儲,Rust,rust,開發(fā)語言,后端
    關(guān)閉應(yīng)用后再打開:
    【rust/egui】(三)看看template的app.rs:序列化、持久化存儲,Rust,rust,開發(fā)語言,后端
    可以看到字符串確實(shí)保持一致,而數(shù)值已經(jīng)變回原樣了。
  • 那我們的數(shù)據(jù)到底存儲在哪里呢?參照上一節(jié)的做法,將eframe的日志輸出打開,可以看到存儲路徑打印出來了
    [2023-08-19T09:26:27Z DEBUG eframe] Using the glow renderer
    [2023-08-19T09:26:27Z DEBUG eframe::native::run] Entering the winit event loop (run_return)[2023-08-19T09:26:27Z DEBUG eframe::native::file_storage] Loading app state from "C:\\Users\\xxxx\\AppData\\Roaming\\demo app\\data\\app.ron"
  • 打開文件,可以看到存儲的內(nèi)容確實(shí)在,其中還存儲了一些其他數(shù)據(jù)
    【rust/egui】(三)看看template的app.rs:序列化、持久化存儲,Rust,rust,開發(fā)語言,后端
  • 當(dāng)我們直接修改對應(yīng)的數(shù)據(jù)后再打開應(yīng)用,對應(yīng)的數(shù)據(jù)也發(fā)生了變化:
    【rust/egui】(三)看看template的app.rs:序列化、持久化存儲,Rust,rust,開發(fā)語言,后端
  • 既然是單個(gè)文件存儲,那么是否會有競爭問題呢?我們打開兩個(gè)應(yīng)用A,B
    【rust/egui】(三)看看template的app.rs:序列化、持久化存儲,Rust,rust,開發(fā)語言,后端
    A想要改字符串,B同時(shí)改了字符串和數(shù)值,B先關(guān)閉,A后關(guān)閉
    【rust/egui】(三)看看template的app.rs:序列化、持久化存儲,Rust,rust,開發(fā)語言,后端
    再次打開應(yīng)用,B修改的數(shù)據(jù)丟失了
    【rust/egui】(三)看看template的app.rs:序列化、持久化存儲,Rust,rust,開發(fā)語言,后端
    因此在開發(fā)/使用的時(shí)候需要注意多窗口下的數(shù)據(jù)存儲問題

參考

  • serde
  • serde api
  • ron

文章來源地址http://www.zghlxwxcb.cn/news/detail-666937.html

到了這里,關(guān)于【rust/egui】(三)看看template的app.rs:序列化、持久化存儲的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【rust/egui】(二)看看template的main函數(shù):日志輸出以及eframe run_native

    【rust/egui】(二)看看template的main函數(shù):日志輸出以及eframe run_native

    rust新手,egui沒啥找到啥教程,這里自己記錄下學(xué)習(xí)過程 環(huán)境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:這里 首先讓我們看看 main.rs 中有些什么 在 eframe 中使用的日志庫為 log 以及 env_logger ,其日志等級有5個(gè): 我們可以在main函數(shù)中添加測試一

    2024年02月13日
    瀏覽(22)
  • rust學(xué)習(xí)-json的序列化和反序列化

    由于 serde 庫默認(rèn)使用 JSON 格式進(jìn)行序列化和反序列化 因此程序?qū)⑹褂?JSON 格式對數(shù)據(jù)進(jìn)行序列化和反序列化 JSON:廣泛使用的 JavaScript 對象符號,用于許多 HTTP API Postcard:no_std 和嵌入式系統(tǒng)友好的緊湊二進(jìn)制格式。 CBOR:用于小消息大小且無需版本協(xié)商的簡潔二進(jìn)制對象表示

    2024年02月12日
    瀏覽(20)
  • 【rust/egui】(一)從編譯運(yùn)行template開始

    【rust/egui】(一)從編譯運(yùn)行template開始

    rust新手,egui沒啥找到啥教程,這里自己記錄下學(xué)習(xí)過程 環(huán)境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 rust windows安裝參考:這里 本文默認(rèn)讀者已安裝相關(guān)環(huán)境(git、vscode等) egui github demo online 關(guān)于 immediate mode wikipedia microsoft learn 先 clone 下這個(gè)項(xiàng)目(也可

    2024年02月13日
    瀏覽(19)
  • 【序列化與反序列化】關(guān)于序列化與反序列化MessagePack的實(shí)踐

    【序列化與反序列化】關(guān)于序列化與反序列化MessagePack的實(shí)踐

    在進(jìn)行序列化操作之前,我們還對系統(tǒng)進(jìn)行壓測,通過 jvisualvm 分析cpu,線程,垃圾回收情況等;運(yùn)用火焰圖 async-profiler 分析系統(tǒng)性能,找出程序中占用CPU資源時(shí)間最長的代碼塊。 代碼放置GitHub:https://github.com/nateshao/leetcode/tree/main/source-code/src/main/java/com/nateshao/source/code/ser

    2024年02月11日
    瀏覽(28)
  • 【網(wǎng)絡(luò)】序列化反序列化

    【網(wǎng)絡(luò)】序列化反序列化

    在前文《網(wǎng)絡(luò)編程套接字》中,我們實(shí)現(xiàn)了服務(wù)器與客戶端之間的字符串通信,這是非常簡單的通信,在實(shí)際使用的過程中,網(wǎng)絡(luò)需要傳輸?shù)牟粌H僅是字符串,更多的是結(jié)構(gòu)化的數(shù)據(jù)(類似于 class , struct 類似的數(shù)據(jù))。 那么我們應(yīng)該怎么發(fā)送這些結(jié)構(gòu)化的數(shù)據(jù)呢? 如果我們

    2024年02月05日
    瀏覽(29)
  • 序列化,反序列化之實(shí)例

    序列化,反序列化之實(shí)例

    介紹文章 __construct() 當(dāng)一個(gè)對象創(chuàng)建時(shí)自動調(diào)用 __destruct() 當(dāng)對象被銷毀時(shí)自動調(diào)用 (php絕大多數(shù)情況下會自動調(diào)用銷毀對象) __sleep() 使**用serialize()函數(shù)時(shí)觸發(fā) __wakeup 使用unserialse()**函數(shù)時(shí)會自動調(diào)用 __toString 當(dāng)一個(gè)對象被當(dāng)作一個(gè)字符串被調(diào)用 __call() 在對象上下文中調(diào)用不

    2024年02月14日
    瀏覽(28)
  • 協(xié)議,序列化,反序列化,Json

    協(xié)議,序列化,反序列化,Json

    協(xié)議究竟是什么呢?首先得知道主機(jī)之間的網(wǎng)絡(luò)通信交互的是什么數(shù)據(jù),像平時(shí)使用聊天APP聊天可以清楚,用戶看到的不僅僅是聊天的文字,還能夠看到用戶的頭像昵稱等其他屬性。也就可以證明網(wǎng)絡(luò)通信不僅僅是交互字符串那么簡單。事實(shí)上網(wǎng)絡(luò)通信還可能會通過一個(gè)結(jié)構(gòu)

    2024年02月13日
    瀏覽(25)
  • 【網(wǎng)絡(luò)】協(xié)議定制+序列化/反序列化

    【網(wǎng)絡(luò)】協(xié)議定制+序列化/反序列化

    如果光看定義很難理解序列化的意義,那么我們可以從另一個(gè)角度來推導(dǎo)出什么是序列化, 那么究竟序列化的目的是什么? 其實(shí)序列化最終的目的是為了對象可以 跨平臺存儲,和進(jìn)行網(wǎng)絡(luò)傳輸 。而我們進(jìn)行跨平臺存儲和網(wǎng)絡(luò)傳輸?shù)姆绞骄褪荌O,而我們的IO支持的數(shù)據(jù)格式就是

    2024年02月08日
    瀏覽(21)
  • Qt 對象序列化/反序列化

    閱讀本文大概需要 3 分鐘 日常開發(fā)過程中,避免不了對象序列化和反序列化,如果你使用 Qt 進(jìn)行開發(fā),那么有一種方法實(shí)現(xiàn)起來非常簡單和容易。 我們知道 Qt 的元對象系統(tǒng)非常強(qiáng)大,基于此屬性我們可以實(shí)現(xiàn)對象的序列化和反序列化操作。 比如有一個(gè)學(xué)生類,包含以下幾

    2024年02月13日
    瀏覽(27)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是兩種常用的數(shù)據(jù)交換格式,用于在不同系統(tǒng)之間傳輸和存儲數(shù)據(jù)。 JSON是一種輕量級的數(shù)據(jù)交換格式,它使用易于理解的鍵值對的形式表示數(shù)據(jù)。JSON數(shù)據(jù)結(jié)構(gòu)簡單明了,易于讀寫和解析,是基于JavaScript的一種常用數(shù)據(jù)

    2024年02月09日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包