在Rust中使用serde对包含无效utf-8字符的路径的PathBuf进行编码

vuktfyat  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个结构体,它的字段之一是pathbuf,struct A { pub first:bool,pub path:PathBuf,} Then path可以包含无效的utf-8字符,因为Linux允许创建包含无效utf-8字符的文件和文件夹。我使用rmp_serde::to_vec_named()从结构体对象中获取vec。但是,如果path包含无效的utf-8字符,它会崩溃,并出现错误:SerdeEncodeMspack((“path contains invalid UTF-8 characters”))。
有没有什么方法可以用无效的utf-8字符编码一个结构而不跳过它?

lqfhib0f

lqfhib0f1#

在序列化时,你能使用一个自定义的反序列化函数将它转换成OsString吗?
像这样的东西应该工作。

use serde::{Deserialize, Serialize};
use std::path::PathBuf;
use std::ffi::OsString;

#[derive(Serialize, Deserialize)]
struct Demo {
    #[serde(with = "path_handling")]
    path: PathBuf,
}

mod path_handling {
    use super::*;
    use serde::de::Deserializer;
    use serde::ser::Serializer;
    pub fn serialize<S>(p: &PathBuf, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        p.as_os_str().serialize(serializer)
    }
    pub fn deserialize<'de, D>(deserializer: D) -> Result<PathBuf, D::Error>
    where
        D: Deserializer<'de>,
    {
        Ok(OsString::deserialize(deserializer)?.into())
    }
}

字符串

woobm2wo

woobm2wo2#

对于大多数项目来说,值得考虑的是,是否值得尝试并支持非UTF-8路径,或者是否可以在应用程序的边界拒绝它们。
我维护了一个名为camino的项目。这个库提供了Utf8PathUtf8PathBuf,它们类似于PathPathBuf,但有一个类型级别的Assert,即它们包含有效的UTF-8。这大大简化了路径处理,但牺牲了一些灵活性(但这种灵活性通常是海市蜃楼,正如README中列出的“makefile问题”所解释的那样)。

相关问题