Rust 如何确保在编译时将类型序列化为JSON数组?

Rust 如何确保在编译时将类型序列化为JSON数组?,rust,serde,Rust,Serde,我有一个特性,我用它作为Rails的ActiveJob的接口;我希望我的Rust后端启动要由Rails API处理的作业: trait BackgroundJob { type Args: Serialize; const QUEUE: &'static str; const CLASS: JobClass; fn payload(self) -> Self::Args; } trait的一个示例实现: impl BackgroundJob fo

我有一个特性,我用它作为Rails的ActiveJob的接口;我希望我的Rust后端启动要由Rails API处理的作业:

trait BackgroundJob {
    type Args: Serialize;
    const QUEUE: &'static str;
    const CLASS: JobClass;

    fn payload(self) -> Self::Args;
}
trait的一个示例实现:

impl BackgroundJob for MyJob {
    type Args = (String,);
    const QUEUE: &'static str = "my_queue";
    const CLASS: JobClass = JobClass::Job1;

    fn payload(self) -> Self::Args {
        (self.payload,)
    }
}

在我的应用程序中,代码稍微复杂一点(具体来说,我有一个Actix actor,而不是
BackgroundJob
上的通用函数),但想法是一样的

这段代码工作正常,但我必须确保
BackgroundJob
的所有实现都将具有作为
Args
类型参数的内容,这些内容将序列化为JSON数组(用于活动作业)

我想做的是在编译时保证
Args
将序列化为数组。可能吗


我曾尝试使用Serde的
SerializeTuple
SerializeSeq
特性,但没有成功。

我很确定答案是“不,Serde没有任何本机特性可以这样做”。没有与这种特殊需求相对应的特征

你可以创建自己的标记特征并要求它存在,但它不会被任何东西自动实现;对于任何有效类型,都必须手动实现它。我猜这不是你想要的:

trait SerializeToJsonArray {}

impl<T> SerializeToJsonArray for Vec<T> {}
impl<T> SerializeToJsonArray for [T] {}
impl<A> SerializeToJsonArray for (A, ) {}
impl<A, B> SerializeToJsonArray for (A, B, ) {}
impl<A, B, C> SerializeToJsonArray for (A, B, C, ) {}
// etc.

trait BackgroundJob {
    type Args: Serialize + SerializeToJsonArray;
}
trait序列化到jsonarray{}
用于Vec{}的impl序列化到JSONArray
[T]{}的impl序列化到JSONArray
(A,){}的impl序列化到JSONArray
(A,B,){}
(A,B,C,){
//等等。
特质背景工作{
类型Args:Serialize+SerializeToJsonArray;
}

这也是很容易破坏的-对于未序列化为数组的类型,您可以轻松实现
SerializeToJsonArray
。同样,Serde不知道这个特性,您仍然需要在序列化时处理非数组。

谢谢您的回答。当你说“让你自己”时,你的意思是定义一个特征(例如,SeralizeToArray)并为我“知道”的结构(元组、向量等)实现它吗它们将被序列化为一个数组?我已经能够定义这个特性,并使用宏为元组和数组提供实现,再加上一个Vec实现。它似乎满足了我的需要,因为作业参数大部分是元组,因为它们不太可能是同一类型的。谢谢附:我怎样才能将这个问题标记为已解决?我应该用我的解决方案来回答我自己的问题吗?谢谢,这并不像你说的那样完美,因为我仍然可以为任何东西实现SerializeToArray,但它仍然可以防止最常见的潜在问题,即当作业只需要一个参数时,忘记将元组设置为
Args