11using CitizenFX . MsgPack . Formatters ;
22using System ;
3+ using System . Collections ;
34using System . Collections . Generic ;
45using System . Reflection ;
56using System . Reflection . Emit ;
@@ -113,12 +114,13 @@ internal static void Serialize(MsgPackSerializer serializer, object obj)
113114 // Adding too much checks here could run slower than a hash map lookup, profile accordingly
114115
115116 Type type = obj . GetType ( ) ;
116- if ( type . IsPrimitive )
117+ if ( type . IsPrimitive || obj is string )
117118 {
118119 switch ( obj )
119120 {
120121 case bool v : serializer . Serialize ( v ) ; break ;
121122 case char v : serializer . Serialize ( v ) ; break ;
123+ case string v : serializer . Serialize ( v ) ; break ;
122124
123125 case byte v : serializer . Serialize ( v ) ; break ;
124126 case ushort v : serializer . Serialize ( v ) ; break ;
@@ -132,28 +134,50 @@ internal static void Serialize(MsgPackSerializer serializer, object obj)
132134
133135 case float v : serializer . Serialize ( v ) ; break ;
134136 case double v : serializer . Serialize ( v ) ; break ;
135- }
137+ }
136138 }
137- else if ( obj is Delegate del )
138- {
139- // add remote function delegate support ? - don't think if it's even planned or supported
140- serializer . Serialize ( del ) ;
141- }
142- // byte[] is a special type handled like a Binary object.
143- // It is not a primitive type, so i serialized as a binary object and deserialized as such.
144- else if ( obj is byte [ ] b )
139+ else if ( obj is Delegate del )
140+ {
141+ // add remote function delegate support ? - don't think if it's even planned or supported
142+ serializer . Serialize ( del ) ;
143+ }
144+ #if ! IS_FXSERVER
145+ else if ( obj is IEnumerable e)
146+ {
147+ serializer . Serialize ( e ) ;
148+ }
149+ #endif
150+ else if ( type . IsGenericType && type. GetGenericTypeDefinition ( ) == typeof ( KeyValuePair < , > ) )
151+ {
152+ var keyProp = type . GetProperty ( "Key" ) ;
153+ var valueProp = type . GetProperty ( "Value" ) ;
154+
155+ var key = keyProp . GetValue ( obj ) ;
156+ var value = valueProp . GetValue ( obj ) ;
157+
158+ serializer . Serialize ( new KeyValuePair < object , object > ( key , value ) ) ;
159+ }
160+ // byte[] is a special type handled like a Binary object.
161+ // It is not a primitive type, so i serialized as a binary object and deserialized as such.
162+ else if ( obj is byte[ ] b)
145163 {
146164 serializer . Serialize ( b ) ;
147165 }
148- // same applies to List<byte>
166+ // same applies to List<byte>
149167 // we serialize it as a byte array and deserialize it as such
150168 // it's not elegant but i needed to handle it like this as byte is a binary format even in List
151169 // Ps: Who the fuck in fivem would retrieve and send List<byte>??????
152- else if ( obj is List < byte > lb )
153- {
154- serializer . Serialize ( lb . ToArray ( ) ) ;
155- }
156- else if ( TryGetSerializer ( type , out var methodInfo ) )
170+ else if ( obj is List< byte > lb)
171+ {
172+ serializer. Serialize( lb . ToArray ( ) ) ;
173+ }
174+ #if ! IS_FXSERVER
175+ else if ( ! type . IsPrimitive && ! type . IsArray && ! type . IsGenericType )
176+ {
177+ serializer . SerializeType ( obj ) ;
178+ }
179+ #endif
180+ else if ( TryGetSerializer ( type , out var methodInfo ) )
157181 {
158182 methodInfo . m_objectSerializer ( serializer , obj ) ;
159183 }
@@ -190,14 +214,14 @@ internal static MethodInfo GetOrCreateSerializer(Type type)
190214
191215 internal static MethodInfo GetOrCreateDeserializer ( Type type )
192216 {
193- return TryGetDeserializer ( type , out var methodInfo )
217+ return TryGetDeserializer ( type , out var methodInfo )
194218 ? methodInfo
195219 : CreateSerializer ( type ) ? . Item2 ;
196220 }
197221
198222 private static Tuple < Serializer , MethodInfo > CreateSerializer ( Type type )
199223 {
200- if ( type . IsPrimitive )
224+ if ( type . IsPrimitive )
201225 {
202226 if ( m_serializers . ContainsKey ( type ) )
203227 return new Tuple < Serializer , MethodInfo > ( m_serializers [ type ] , m_serializers [ type ] . m_method ) ;
@@ -206,7 +230,7 @@ private static Tuple<Serializer, MethodInfo> CreateSerializer(Type type)
206230 }
207231 else if ( type . IsArray )
208232 {
209- switch ( type . GetArrayRank ( ) )
233+ switch ( type . GetArrayRank ( ) )
210234 {
211235 case 1 :
212236 return ArrayFormatter . Build ( type . GetElementType ( ) , type ) ;
@@ -215,7 +239,7 @@ private static Tuple<Serializer, MethodInfo> CreateSerializer(Type type)
215239 else if ( type . IsGenericType )
216240 {
217241 var genericTypes = type . GetGenericArguments ( ) ;
218- switch ( genericTypes . Length )
242+ switch ( genericTypes . Length )
219243 {
220244 case 1 :
221245 {
@@ -225,7 +249,7 @@ private static Tuple<Serializer, MethodInfo> CreateSerializer(Type type)
225249 break ;
226250 case 2 :
227251 {
228- if ( ImplementsGenericTypeDefinition ( type , typeof ( IDictionary < , > ) ) )
252+ if ( ImplementsGenericTypeDefinition ( type , typeof ( IDictionary < , > ) ) )
229253 return DictionaryFormatter . Build ( genericTypes [ 0 ] , genericTypes [ 1 ] ) ;
230254 break ;
231255 }
0 commit comments