|
12 | 12 | use std::marker::PhantomData;
|
13 | 13 |
|
14 | 14 | use crate::array::{GcArray, GcString};
|
15 |
| -use serde::de::{self, Deserializer, DeserializeSeed}; |
| 15 | +use serde::{Serialize, de::{self, Deserializer, DeserializeSeed}, ser::SerializeSeq}; |
16 | 16 |
|
17 | 17 | use crate::prelude::*;
|
18 | 18 |
|
@@ -66,6 +66,34 @@ impl<'gc, 'de, Id: CollectorId> GcDeserialize<'gc, 'de, Id> for GcString<'gc, Id
|
66 | 66 | }
|
67 | 67 | }
|
68 | 68 |
|
| 69 | +impl<'gc, T: Serialize, Id: CollectorId> Serialize for Gc<'gc, T, Id> { |
| 70 | + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where |
| 71 | + S: serde::Serializer { |
| 72 | + self.value().serialize(serializer) |
| 73 | + } |
| 74 | +} |
| 75 | + |
| 76 | + |
| 77 | +impl<'gc, T: Serialize, Id: CollectorId> Serialize for GcArray<'gc, T, Id> { |
| 78 | + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where |
| 79 | + S: serde::Serializer { |
| 80 | + let mut seq = serializer.serialize_seq(Some(self.len()))?; |
| 81 | + for val in self.as_slice().iter() { |
| 82 | + seq.serialize_element(val)?; |
| 83 | + } |
| 84 | + seq.end() |
| 85 | + } |
| 86 | +} |
| 87 | + |
| 88 | + |
| 89 | +impl<'gc, Id: CollectorId> Serialize for GcString<'gc, Id> { |
| 90 | + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where |
| 91 | + S: serde::Serializer { |
| 92 | + serializer.serialize_str(self.as_str()) |
| 93 | + } |
| 94 | +} |
| 95 | + |
| 96 | + |
69 | 97 | /// Implement [GcDeserialize] for a type by delegating to its [serde::Deserialize] implementation.
|
70 | 98 | ///
|
71 | 99 | /// This should only be used for types that can never have gc pointers inside of them (or if you don't care to support that).
|
|
0 commit comments