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没有它。