arrays - 如何让 serde 序列化结构数组?
问题描述
我正在尝试使用neon
生成到rust library的绑定。我serde
用来处理数据,但它只有一个宏,用于定义长度为 32的数组。
该宏代码是:
macro_rules! array_impls {
($($len:tt)+) => {
$(
impl<T> Serialize for [T; $len]
where
T: Serialize,
{
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = try!(serializer.serialize_tuple($len));
for e in self {
try!(seq.serialize_element(e));
}
seq.end()
}
}
)+
}
}
array_impls! {
01 02 03 04 05 06 07 08 09 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32
}
我一开始尝试将宏粘贴到并调用array_impls! { 1024 }
,但 rust 不允许从这个 crate 外部修改类型,宏中的泛型可能会这样做。
我对实现的最佳猜测是:
impl Serialize for [PolyCoeff; N] {
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut seq = serializer.serialize_tuple(N)?;
for e in self.iter_mut().enumerate() {
seq.serialize_element(e)?;
}
seq.end()
}
}
有几个不同的错误。主要的是“ this is not defined in the current crate because arrays are always foreign
”。
我发现了数组大小限制的 github 问题。他们建议以下作为解决方法:
struct S {
#[serde(serialize_with = "<[_]>::serialize")]
arr: [u8; 256],
}
我还不能让它编译。
解决方案
这是以前遇到过的问题serde
,并且有一个 crate 处理它。我的最终代码看起来像:
use serde::{Serialize, Deserialize};
use serde_big_array::big_array;
big_array! { BigArray; N }
#[derive(Copy, Clone, Serialize, Deserialize)]
pub struct Poly {
#[serde(with = "BigArray")]
coeffs: [PolyCoeff; N],
}
推荐阅读
- json - 在 Power Automate 中,如何从 .csv 电子邮件附件中获取数据并将其格式化以供显示?
- styled-components - styled-components - 从 styled.div 中分配全局样式,无需 createGlobalStyle
- c# - ListDetailsView DetailsTemplate 中的类型错误
- css - 使跨度元素移动到CSS中的新行,样式化组件
- python - 在 Matplotlib 饼图中对较小的值进行分组
- webpack - 使用 Webapck 5 监视多个目录中的更改
- python - 脚本无法使用请求从网页中提取某些字段
- amazon-web-services - 如何使用 SSL 将我的域指向没有 Route 53 的 Elastic Beanstalk?
- python - 使用 iexact 时如何添加 index_together
- linux - 从根目录授予特定用户对特定文件夹的权限