如何解决为MessagePack实现Serde的序列序列化程序时无法正确获得生存期
我想在Rust中编写一个无标准兼容的MessagePack序列化器/反序列化器。我有大部分的序列化工作,但是我在努力使用serde序列化结构,序列和图。我从serde_json_core复制了很多内容,但是序列序列化程序的生存期不正确。
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 举报,一经查实,本站将立刻删除。