为MessagePack实现Serde的序列序列化程序时无法正确获得生存期

如何解决为MessagePack实现Serde的序列序列化程序时无法正确获得生存期

我想在Rust中编写一个无标准兼容的MessagePack序列化器/反序列化器。我有大部分的序列化工作,但是我在努力使用serde序列化结构,序列和图。我从serde_json_core复制了很多内容,但是序列序列化程序的生存期不正确。

playground

extern crate generic_array_0_13_2; // 0.13.2
extern crate serde; 

use serde::ser;

pub struct Serializer<'a> {
    buf: &'a mut [u8],pos: usize,}
pub struct SerializeSeq<'a> {
    ser: &'a mut Serializer<'a>,}

impl<'a> ser::SerializeSeq for SerializeSeq<'a> {
    type Ok = ();
    type Error = Error;

    fn serialize_element<T: ?Sized>(&mut self,value: &T) -> Result<Self::Ok,Self::Error>
    where
        T: ser::Serialize,{
        // -------- This does not compile
        value.serialize(&mut *self.ser)?;
        Ok(())
    }
    fn end(self) -> Result<Self::Ok,Self::Error> {
        Ok(())
    }
}

impl<'a> ser::Serializer for &'a mut Serializer<'a> {
    type Ok = ();
    type Error = Error;
    type SerializeSeq = SerializeSeq<'a>;
    type SerializeTuple = SerializeSeq<'a>;
    type SerializeTupleStruct = Unreachable;
    type SerializeTupleVariant = Unreachable;
    type SerializeMap = SerializeMap<'a>;
    type SerializeStruct = SerializeStruct<'a>;
    type SerializeStructVariant = Unreachable;
    // ...

    fn serialize_seq(self,_len: Option<usize>) -> Result<Self::SerializeSeq,Self::Error> {
        Ok(SerializeSeq::new(self))
    }
    fn serialize_tuple(self,len: usize) -> Result<Self::SerializeTuple,Self::Error> {
        self.serialize_seq(Some(len))
    }

    fn serialize_bool(self,_: bool) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_i8(self,_: i8) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_i16(self,_: i16) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_i32(self,_: i32) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_i64(self,_: i64) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_u8(self,_: u8) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_u16(self,_: u16) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_u32(self,_: u32) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_u64(self,_: u64) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_f32(self,_: f32) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_f64(self,_: f64) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_char(self,_: char) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_str(self,_: &str) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_bytes(self,_: &[u8]) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_none(self) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_some<T: ?Sized>(self,_: &T) -> Result<Self::Ok,{
        todo!()
    }
    fn serialize_unit(self) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_unit_struct(self,_: &'static str) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_unit_variant(
        self,_: &'static str,_: u32,) -> Result<Self::Ok,Self::Error> {
        todo!()
    }
    fn serialize_newtype_struct<T: ?Sized>(
        self,_: &T,Self::Error>
    where
        T: serde::Serialize,{
        todo!()
    }
    fn serialize_newtype_variant<T: ?Sized>(
        self,{
        todo!()
    }
    fn serialize_tuple_struct(
        self,_: usize,) -> std::result::Result<
        <Self as serde::Serializer>::SerializeTupleStruct,<Self as serde::Serializer>::Error,> {
        todo!()
    }
    fn serialize_tuple_variant(
        self,) -> std::result::Result<
        <Self as serde::Serializer>::SerializeTupleVariant,> {
        todo!()
    }
    fn serialize_map(
        self,_: std::option::Option<usize>,) -> std::result::Result<
        <Self as serde::Serializer>::SerializeMap,> {
        todo!()
    }
    fn serialize_struct(
        self,) -> std::result::Result<
        <Self as serde::Serializer>::SerializeStruct,> {
        todo!()
    }
    fn serialize_struct_variant(
        self,) -> std::result::Result<
        <Self as serde::Serializer>::SerializeStructVariant,> {
        todo!()
    }
}

// ---- The remaining part is just to make the compiler stop complaining about missing implementations

impl<'a> SerializeSeq<'a> {
    pub fn new(ser: &'a mut Serializer<'a>) -> Self {
        SerializeSeq { ser }
    }
}

pub struct SerializeMap<'a> {
    ser: &'a mut Serializer<'a>,}
pub struct SerializeStruct<'a> {
    ser: &'a mut Serializer<'a>,}

impl<'a> ser::SerializeTuple for SerializeSeq<'a> {
    type Ok = ();
    type Error = Error;

    fn serialize_element<T: ?Sized>(&mut self,{
        ser::SerializeSeq::serialize_element(self,value)
    }

    fn end(self) -> Result<Self::Ok,Self::Error> {
        ser::SerializeSeq::end(self)
    }
}

impl<'a> ser::SerializeStruct for SerializeStruct<'a> {
    type Ok = ();
    type Error = Error;

    fn serialize_field<T: ?Sized>(
        &mut self,key: &'static str,value: &T,{
        //value.serialize(&mut *self.ser)?;
        Ok(())
    }

    fn end(self) -> Result<Self::Ok,Self::Error> {
        Ok(())
    }
}

impl<'a> ser::SerializeMap for SerializeMap<'a> {
    type Ok = ();
    type Error = Error;

    fn end(self) -> Result<Self::Ok,Self::Error> {
        Ok(())
    }

    fn serialize_key<T: ?Sized>(&mut self,key: &T) -> Result<Self::Ok,{
        //key.serialize(&mut *self.ser)?;
        Ok(())
    }

    fn serialize_value<T: ?Sized>(&mut self,{
        //value.serialize(&mut *self.ser)?;
        Ok(())
    }
}

#[derive(Debug)]
enum Error {}
impl std::fmt::Display for Error {
    fn fmt(&self,f: &mut std::fmt::Formatter) -> std::fmt::Result {
        todo!()
    }
}
impl std::error::Error for Error {}
impl serde::ser::Error for Error {
    fn custom<T>(_: T) -> Self
    where
        T: std::fmt::Display,{
        todo!()
    }
}
pub enum Unreachable {}

impl ser::SerializeTupleStruct for Unreachable {
    type Ok = ();
    type Error = Error;

    fn serialize_field<T: ?Sized>(&mut self,_value: &T) -> Result<Self::Ok,Self::Error> {
        unreachable!()
    }

    fn end(self) -> Result<Self::Ok,Self::Error> {
        unreachable!()
    }
}

impl ser::SerializeTupleVariant for Unreachable {
    type Ok = ();
    type Error = Error;

    fn serialize_field<T: ?Sized>(&mut self,Self::Error> {
        unreachable!()
    }
}

impl ser::SerializeMap for Unreachable {
    type Ok = ();
    type Error = Error;

    fn serialize_key<T: ?Sized>(&mut self,_key: &T) -> Result<Self::Ok,{
        unreachable!()
    }

    fn serialize_value<T: ?Sized>(&mut self,{
        unreachable!()
    }

    fn end(self) -> Result<Self::Ok,Self::Error> {
        unreachable!()
    }
}

impl ser::SerializeStructVariant for Unreachable {
    type Ok = ();
    type Error = Error;

    fn serialize_field<T: ?Sized>(
        &mut self,_key: &'static str,_value: &T,Self::Error> {
        unreachable!()
    }
}

这是我得到的错误:

error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
  --> src/lib.rs:23:25
   |
23 |         value.serialize(&mut *self.ser)?;
   |                         ^^^^^^^^^^^^^^
   |
note: first,the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 18:5...
  --> src/lib.rs:18:5
   |
18 | /     fn serialize_element<T: ?Sized>(&mut self,Self::Error>
19 | |     where
20 | |         T: ser::Serialize,21 | |     {
...  |
24 | |         Ok(())
25 | |     }
   | |_____^
note: ...so that reference does not outlive borrowed content
  --> src/lib.rs:23:25
   |
23 |         value.serialize(&mut *self.ser)?;
   |                         ^^^^^^^^^^^^^^
note: but,the lifetime must be valid for the lifetime `'a` as defined on the impl at 14:6...
  --> src/lib.rs:14:6
   |
14 | impl<'a> ser::SerializeSeq for SerializeSeq<'a> {
   |      ^^
note: ...so that the types are compatible
  --> src/lib.rs:23:15
   |
23 |         value.serialize(&mut *self.ser)?;
   |               ^^^^^^^^^
   = note: expected `serde::Serializer`
              found `serde::Serializer`

这与Serializer中字节片的生存期和&mut Serializer冲突的生存期有关,但是我一生都无法解决。我尝试添加更多的生命周期注释,并引入了特征绑定以摆脱第二生命周期,但没有任何效果...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-