88#endregion
99
1010using System ;
11+ using System . Collections ;
1112using System . Collections . Concurrent ;
1213using System . IO ;
14+ using System . Linq ;
1315using Hyperion . Extensions ;
1416using Hyperion . ValueSerializers ;
1517
@@ -21,7 +23,7 @@ internal sealed class ArraySerializerFactory : ValueSerializerFactory
2123
2224 public override bool CanDeserialize ( Serializer serializer , Type type ) => CanSerialize ( serializer , type ) ;
2325
24- private static void WriteValues < T > ( T [ ] array , Stream stream , Type elementType , ValueSerializer elementSerializer , SerializerSession session )
26+ private static void WriteValues ( Array array , Stream stream , Type elementType , ValueSerializer elementSerializer , SerializerSession session )
2527 {
2628 Int32Serializer . WriteValueImpl ( stream , array . Length , session ) ;
2729 var preserveObjectReferences = session . Serializer . Options . PreserveObjectReferences ;
@@ -30,12 +32,13 @@ private static void WriteValues<T>(T[] array, Stream stream, Type elementType, V
3032 stream . WriteObject ( value , elementType , elementSerializer , preserveObjectReferences , session ) ;
3133 }
3234 }
33- private static void ReadValues < T > ( int length , Stream stream , DeserializerSession session , T [ ] array )
35+
36+ private static void ReadValues ( int length , Stream stream , DeserializerSession session , Array array )
3437 {
3538 for ( var i = 0 ; i < length ; i ++ )
3639 {
37- var value = ( T ) stream . ReadObject ( session ) ;
38- array [ i ] = value ;
40+ var value = stream . ReadObject ( session ) ;
41+ array . SetValue ( value , i ) ;
3942 }
4043 }
4144
@@ -57,7 +60,7 @@ public override ValueSerializer BuildSerializer(Serializer serializer, Type type
5760 session . TrackDeserializedObject ( array ) ;
5861 }
5962
60- ReadValues ( length , stream , session , ( dynamic ) array ) ;
63+ ReadValues ( length , stream , session , array ) ;
6164
6265 return array ;
6366 } ;
@@ -68,7 +71,8 @@ public override ValueSerializer BuildSerializer(Serializer serializer, Type type
6871 session . TrackSerializedObject ( arr ) ;
6972 }
7073
71- WriteValues ( ( dynamic ) arr , stream , elementType , elementSerializer , session ) ;
74+ // This janky way of converting array to Array is done to get around the problem of ValueType arrays
75+ WriteValues ( ( ( IEnumerable ) arr ) . Cast < object > ( ) . ToArray ( ) , stream , elementType , elementSerializer , session ) ;
7276 } ;
7377 arraySerializer . Initialize ( reader , writer ) ;
7478
0 commit comments