热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Rust结构数组、序列化与反序列化

文章目录一、结构数组二、序列化三、反序列化一、结构数组constv0:i80;constv1:i81;constv2:i82;constv3:i83;structArr{v


文章目录

      • 一、结构数组
      • 二、序列化
      • 三、反序列化


一、结构数组

const v0: i8 = 0;
const v1: i8 = 1;
const v2: i8 = 2;
const v3: i8 = 3;struct Arr {v: i8,s: &'static str,
}const str: [Arr; 4] = [Arr {v: v0, s:"zero",},Arr {v: v1, s:"one",},Arr {v: v2, s:"two",},Arr {v: v3, s:"three",},
];fn main() {println!("{}", str[2].v);
}

初始化一些方法:
此方法安全,但是效率不高,会复制10份Foo { a: 10, b: 10}结构体。

#[derive(Copy, Clone, Debug)]
struct Foo {a: u32,b: u32,
}fn main() {let mut foo_array = [Foo { a: 10, b: 10 }; 10];
}

高效方法:
Cargo.toml

...
[dependencies]
arrayvec = "0.4.10"

main.rs

use arrayvec::ArrayVec;
use std::iter;#[derive(Clone)]
struct Foo {a: u32,b: u32,
}fn main() {let foo_array: [Foo; 10] &#61; iter::repeat(Foo { a: 10, b: 10 }).collect::<ArrayVec<_>>().into_inner().unwrap_or_else(|_| unreachable!());
}

或者

struct Foo {foo: isize,
}impl Foo {pub fn new(i: isize) -> Foo {//do stuff with iFoo { foo: i }}
}fn main() {//this was my best guess...let foo_array: [Foo; N] &#61; [0..N].iter().map(|i| Foo::new(i));
}

二、序列化

Rust Crate 使用&#xff1a;serde
序列化和反序列化是非常通用的功能&#xff0c;在网络传输&#xff0c;数据存储上极其常见的。序列化和反序列化的通用解释是&#xff1a;

seriallization 序列化 &#xff1a; 将对象转化为便于传输的格式&#xff0c; 常见的序列化格式&#xff1a;二进制格式&#xff0c;字节数组&#xff0c;json字符串&#xff0c;xml字符串。
deseriallization 反序列化&#xff1a;将序列化的数据恢复为对象的过程。

格式编写者只需实现 Serde 的 trait 即可&#xff0c;而用户通过#[derive(Serialize&#xff0c;Deserialize)]对其对象进行序列化&#xff0c;而无需考虑格式。

Cargo.toml

...
[dependencies]
serde &#61; { version &#61; "1.0", features &#61; ["derive"] }
serde_json &#61; "1.0.0"
...

use serde::{Serialize, Deserialize};#[derive(Serialize, Deserialize)]
struct Person {name: String,age: u8,phones: Vec<String>,weight: Option<u8>,
}fn main() {let data &#61; r#"{"name": "John Doe","age": 43,"phones": ["&#43;44 1234567","&#43;44 2345678"]}"#;// 解析字符串到Person对象。let p: Person &#61; serde_json::from_str(data).unwrap();println!("Please call {} at the number {}", p.name, p.phones[0]);// Person对象转为JSON字符串.let serialized &#61; serde_json::to_string(&p).unwrap();println!("serialized &#61; {}", serialized);
}

关于更多&#xff1a;https://blog.logrocket.com/rust-serialization-whats-ready-for-production-today/


三、反序列化

use serde_json;
use std::result::Result;
use std::error::Error;
use serde::{Deserialize, Serialize};#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
enum Speech {Str(String),StrArray(Vec<String>),
}#[derive(Debug, Serialize, Deserialize)]
struct Foo {pub foo: String,#[serde(skip_serializing_if &#61; "Option::is_none")]speech: Option<Speech>,
} fn main() -> Result<(), Box<dyn Error>> {let json1 &#61; r#"{"foo": "bar","speech": "something"}"#; let json2 &#61; r#"{"foo": "bar","speech": ["something", "something else"]}"#; let json3 &#61; r#"{"foo": "bar"}"#; let foo1: Foo &#61; serde_json::from_str(json1)?;let back_to_str_foo1 &#61; serde_json::to_string(&foo1).unwrap();println!("foo1 {:#?}", foo1);println!("back_to_str_foo1 {}", back_to_str_foo1);let foo2: Foo &#61; serde_json::from_str(json2)?;let back_to_str_foo2 &#61; serde_json::to_string(&foo2).unwrap();println!("foo1 {:#?}", foo2);println!("back_to_str_foo2 {}", back_to_str_foo2);let foo3: Foo &#61; serde_json::from_str(json3)?;let back_to_str_foo3 &#61; serde_json::to_string(&foo3).unwrap();println!("foo1 {:#?}", foo3);println!("back_to_str_foo3 {}", back_to_str_foo3);Ok(())
}

推荐阅读
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 原文地址:https:blog.csdn.netqq_35361471articledetails84715491原文地址:https:blog.cs ... [详细]
  • 本文探讨了如何高效地计算数组中和为2的幂的偶对数量,提供了从基础到优化的方法。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文将详细介绍如何使用Java编程语言生成指定数量的不重复随机数,包括具体的实现方法和代码示例。适合初学者和有一定基础的开发者参考。 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
  • 在Effective Java第三版中,建议在方法返回类型中优先考虑使用Collection而非Stream,以提高代码的灵活性和兼容性。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
author-avatar
郑云雪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有