首页 > 解决方案 > 如何让 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],
}

我还不能让它编译。

标签: arraysrustserde

解决方案


这是以前遇到过的问题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],
}

推荐阅读