Serialization avro rs解释“uuid”会导致SerdeError

Serialization avro rs解释“uuid”会导致SerdeError,serialization,rust,avro,uuid,serde,Serialization,Rust,Avro,Uuid,Serde,我正在尝试使用avro\u rs将数据反序列化到带有Uuid字段的结构中 使用avro_rs::type::Value; 使用serde::反序列化; 使用uuid::uuid; #[派生(调试、克隆、反序列化)] #[serde(重命名为_all=“camelCase”)] 发布结构元数据{ 发布事件uuid:uuid, } fn main(){ 让uuid=Value::uuid(uuid::parse_str(“936DA01F9ABD4d9d80C702AF85C822A8”).unwr

我正在尝试使用
avro\u rs
将数据反序列化到带有
Uuid
字段的结构中

使用avro_rs::type::Value;
使用serde::反序列化;
使用uuid::uuid;
#[派生(调试、克隆、反序列化)]
#[serde(重命名为_all=“camelCase”)]
发布结构元数据{
发布事件uuid:uuid,
}
fn main(){
让uuid=Value::uuid(uuid::parse_str(“936DA01F9ABD4d9d80C702AF85C822A8”).unwrap();
让avro_uuid=avro_rs::from_value::(&uuid);
eprintln!(“avro_uuid={:?}”,avro_uuid);
让metadata=Value::Record(vec![(“eventUuid.to_owned(),uuid)];
让avro_metadata=avro_rs::from_value::(&metadata);
}
货舱

[package]
name = "pp-avro"
version = "0.1.0"
edition = "2018"

[dependencies]

avro-rs = { version = ">= 0.6" }
serde = "1.0"
serde_json = "1.0"
uuid = { version = "0.8.1", features = ["serde", "v4"] }
这给了我一个错误:

avro_uuid=Err(
错误{
消息:“不是字符串|字节|固定”,
},
)

创建
元数据
对象是不可能的。

我不是avro的专家,但这是我的直觉:

fn main() -> Result<(), Box<dyn Error>> {
    let uuid = Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap();
    let uuid_val = Value::Uuid(uuid.clone());
    let metadata = Metadata { event_uuid: uuid };
    let ser = avro_rs::to_value(&metadata)?;
    println!("{:?}", ser);
    Ok(())
}
正如您所建议的,能够运行以下功能是有意义的:

let uuid = Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap();
let uuid_val = Value::Uuid(uuid);
let metadata = Value::Record(vec![("eventUuid".to_owned(), uuid_val)]);
println!("{:?}", metadata);
avro_rs::from_value::<Metadata>(&metadata)?;
我的猜测是,这可能是一个bug,或者是当您想从
反序列化而不提供模式时所期望的结果


旧答案:

您尚未添加Cargo.toml的内容,但如果您正在使用此库:

我认为您错过了
serde
功能的规范,根据自述文件:

 * serde - adds the ability to serialize and deserialize a Uuid using the serde crate.
因此,在Cargo.toml中,应该有如下内容:

uuid = { version = "0.8", features = ["serde"] }

我不是avro_的专家,但这是我的直觉:

fn main() -> Result<(), Box<dyn Error>> {
    let uuid = Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap();
    let uuid_val = Value::Uuid(uuid.clone());
    let metadata = Metadata { event_uuid: uuid };
    let ser = avro_rs::to_value(&metadata)?;
    println!("{:?}", ser);
    Ok(())
}
正如您所建议的,能够运行以下功能是有意义的:

let uuid = Uuid::parse_str("936DA01F9ABD4d9d80C702AF85C822A8").unwrap();
let uuid_val = Value::Uuid(uuid);
let metadata = Value::Record(vec![("eventUuid".to_owned(), uuid_val)]);
println!("{:?}", metadata);
avro_rs::from_value::<Metadata>(&metadata)?;
我的猜测是,这可能是一个bug,或者是当您想从
反序列化而不提供模式时所期望的结果


旧答案:

您尚未添加Cargo.toml的内容,但如果您正在使用此库:

我认为您错过了
serde
功能的规范,根据自述文件:

 * serde - adds the ability to serialize and deserialize a Uuid using the serde crate.
因此,在Cargo.toml中,应该有如下内容:

uuid = { version = "0.8", features = ["serde"] }

我有那个。这是我toml的一部分:
avro-rs={version=“>=0.6”}serde=“1.0”serde_-json=“1.0”uuid={version=“0.8.1”,features=[“serde”,“v4”]}
对吗?因为您的serde缺少特性=[“派生”],否则您将无法派生反序列化traitAs a side,您可能希望在问题中包含cargo.toml的内容以获得其他上下文。这是一个MRE/您可能希望包含cargo.toml-您的答案也应该包括它,因为OP没有它。我有一个。这是我toml的一部分:
avro-rs={version=“>=0.6”}serde=“1.0”serde_-json=“1.0”uuid={version=“0.8.1”,features=[“serde”,“v4”]}
对吗?因为您的serde缺少特性=[“派生”],否则您将无法派生反序列化traitAs a side,您可能希望在问题中包含cargo.toml的内容以获得更多上下文。这是一个MRE/您可能希望包含cargo.toml-您的答案也应该包括它,因为OP没有它。