上下文:我正在使用一个需要将对象传递到另一个进程或通过tcp连接传递给它的库,所以我不希望用户关心库进行序列化的方式。

是否可以通用使用“可编码”?

如果是这样,如何将“Encodable”类型参数绑定(bind)到T,以便可以在“main”中使用“Foo.send”方法?

可以通过不需要“主要”提及序列化格式的方式来完成吗?

extern crate serialize;

use serialize::{json, Encodable};

struct Foo<T>;

impl<T> Foo<T> {
    fn send(&self, data: T) {
        // error: failed to find an implementation of trait
        // serialize::serialize::Encodable<serialize::json::
        // Encoder<'_>,std::io::IoError> for T
        println!("{}", json::Encoder::str_encode(&data));
    }
}

#[deriving(Encodable)]
struct DataX {
    a : int,
}

fn main() {
    let sourceX = DataX { a : 1 };
    let fooX = Foo::<DataX>;
    fooX.send(sourceX);
}

最佳答案

您可以使用如下所示的bounded type parameterin the playpen

extern crate serialize;

use serialize::{json, Encodable, Encoder};
use std::io::{IoError};

struct Foo<T>;

impl<'a, T: Encodable<json::Encoder<'a>, IoError>> Foo<T> {
    fn send(&self, data: T) {
        println!("{}", json::Encoder::str_encode(&data));
    }
}

#[deriving(Encodable)]
struct DataX {
    a : int,
}

fn main() {
    let sourceX = DataX { a : 1 };
    let fooX = Foo::<DataX>;
    fooX.send(sourceX);
}

输出:
{"a":1}

09-27 09:28