fory_core/serializer/
arc.rs1use crate::context::{ReadContext, WriteContext};
19use crate::error::Error;
20use crate::resolver::{RefFlag, RefMode};
21use crate::resolver::{TypeInfo, TypeResolver};
22use crate::serializer::{ForyDefault, Serializer};
23use crate::type_id::TypeId;
24use std::rc::Rc;
25use std::sync::Arc;
26
27impl<T: Serializer + ForyDefault + Send + Sync + 'static> Serializer for Arc<T> {
28 fn fory_is_shared_ref() -> bool {
29 true
30 }
31 fn fory_write(
32 &self,
33 context: &mut WriteContext,
34 ref_mode: RefMode,
35 write_type_info: bool,
36 has_generics: bool,
37 ) -> Result<(), Error> {
38 match ref_mode {
39 RefMode::None => {
40 if write_type_info {
42 T::fory_write_type_info(context)?;
43 }
44 T::fory_write_data_generic(self, context, has_generics)
45 }
46 RefMode::NullOnly => {
47 context.writer.write_i8(RefFlag::NotNullValue as i8);
49 if write_type_info {
50 T::fory_write_type_info(context)?;
51 }
52 T::fory_write_data_generic(self, context, has_generics)
53 }
54 RefMode::Tracking => {
55 if context
57 .ref_writer
58 .try_write_arc_ref(&mut context.writer, self)
59 {
60 return Ok(());
62 }
63 if write_type_info {
65 T::fory_write_type_info(context)?;
66 }
67 T::fory_write_data_generic(self, context, has_generics)
68 }
69 }
70 }
71
72 fn fory_write_data_generic(
73 &self,
74 context: &mut WriteContext,
75 has_generics: bool,
76 ) -> Result<(), Error> {
77 if T::fory_is_shared_ref() {
78 return Err(Error::not_allowed(
79 "Arc<T> where T is a shared ref type is not allowed for serialization.",
80 ));
81 }
82 T::fory_write_data_generic(&**self, context, has_generics)
83 }
84
85 fn fory_write_data(&self, context: &mut WriteContext) -> Result<(), Error> {
86 self.fory_write_data_generic(context, false)
87 }
88
89 fn fory_write_type_info(context: &mut WriteContext) -> Result<(), Error> {
90 T::fory_write_type_info(context)
91 }
92
93 fn fory_read(
94 context: &mut ReadContext,
95 ref_mode: RefMode,
96 read_type_info: bool,
97 ) -> Result<Self, Error> {
98 read_arc(context, ref_mode, read_type_info, None)
99 }
100
101 fn fory_read_with_type_info(
102 context: &mut ReadContext,
103 ref_mode: RefMode,
104 typeinfo: Rc<TypeInfo>,
105 ) -> Result<Self, Error>
106 where
107 Self: Sized + ForyDefault,
108 {
109 read_arc(context, ref_mode, false, Some(typeinfo))
110 }
111
112 fn fory_read_data(context: &mut ReadContext) -> Result<Self, Error> {
113 if T::fory_is_shared_ref() {
114 return Err(Error::not_allowed(
115 "Arc<T> where T is a shared ref type is not allowed for deserialization.",
116 ));
117 }
118 let inner = T::fory_read_data(context)?;
119 Ok(Arc::new(inner))
120 }
121
122 #[inline]
123 fn fory_read_data_as_send_sync_any(
124 context: &mut ReadContext,
125 ) -> Result<Box<dyn std::any::Any + Send + Sync>, Error>
126 where
127 Self: Sized + ForyDefault,
128 {
129 Ok(crate::serializer::box_send_sync(Self::fory_read_data(
130 context,
131 )?))
132 }
133
134 fn fory_read_type_info(context: &mut ReadContext) -> Result<(), Error> {
135 T::fory_read_type_info(context)
136 }
137
138 fn fory_reserved_space() -> usize {
139 4
142 }
143
144 fn fory_get_type_id(type_resolver: &TypeResolver) -> Result<TypeId, Error> {
145 T::fory_get_type_id(type_resolver)
146 }
147
148 fn fory_get_type_info(type_resolver: &TypeResolver) -> Result<Rc<TypeInfo>, Error> {
149 T::fory_get_type_info(type_resolver)
150 }
151
152 fn fory_type_id_dyn(&self, type_resolver: &TypeResolver) -> Result<TypeId, Error> {
153 (**self).fory_type_id_dyn(type_resolver)
154 }
155
156 fn fory_static_type_id() -> TypeId {
157 T::fory_static_type_id()
158 }
159
160 fn as_any(&self) -> &dyn std::any::Any {
161 self
162 }
163}
164
165fn read_arc<T: Serializer + ForyDefault + 'static>(
166 context: &mut ReadContext,
167 ref_mode: RefMode,
168 read_type_info: bool,
169 typeinfo: Option<Rc<TypeInfo>>,
170) -> Result<Arc<T>, Error> {
171 match ref_mode {
172 RefMode::None => {
173 let inner = read_arc_inner::<T>(context, read_type_info, typeinfo)?;
175 Ok(Arc::new(inner))
176 }
177 RefMode::NullOnly => {
178 let ref_flag = context.reader.read_i8()?;
180 if ref_flag == RefFlag::Null as i8 {
181 return Err(Error::invalid_ref("Arc cannot be null"));
182 }
183 let inner = read_arc_inner::<T>(context, read_type_info, typeinfo)?;
184 Ok(Arc::new(inner))
185 }
186 RefMode::Tracking => {
187 let ref_flag = context.ref_reader.read_ref_flag(&mut context.reader)?;
189 match ref_flag {
190 RefFlag::Null => Err(Error::invalid_ref("Arc cannot be null")),
191 RefFlag::Ref => {
192 let ref_id = context.ref_reader.read_ref_id(&mut context.reader)?;
193 context.ref_reader.get_arc_ref::<T>(ref_id).ok_or_else(|| {
194 Error::invalid_ref(format!("Arc reference {ref_id} not found"))
195 })
196 }
197 RefFlag::NotNullValue => {
198 let inner = read_arc_inner::<T>(context, read_type_info, typeinfo)?;
199 Ok(Arc::new(inner))
200 }
201 RefFlag::RefValue => {
202 let ref_id = context.ref_reader.reserve_ref_id();
203 let inner = read_arc_inner::<T>(context, read_type_info, typeinfo)?;
204 let arc = Arc::new(inner);
205 context.ref_reader.store_arc_ref_at(ref_id, arc.clone());
206 Ok(arc)
207 }
208 }
209 }
210 }
211}
212
213fn read_arc_inner<T: Serializer + ForyDefault + 'static>(
214 context: &mut ReadContext,
215 read_type_info: bool,
216 typeinfo: Option<Rc<TypeInfo>>,
217) -> Result<T, Error> {
218 if let Some(typeinfo) = typeinfo {
221 return T::fory_read_with_type_info(context, RefMode::None, typeinfo);
222 }
223 if read_type_info {
224 T::fory_read_type_info(context)?;
225 }
226 T::fory_read_data(context)
227}
228
229impl<T: ForyDefault> ForyDefault for Arc<T> {
230 fn fory_default() -> Self {
231 Arc::new(T::fory_default())
232 }
233}