Skip to content

Commit bd322df

Browse files
committed
feat: Added array serialization support
Fixes: #237
1 parent 2e09de3 commit bd322df

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

MLAPI/Serialization/BitReader.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ public object ReadObjectPacked(Type type)
102102

103103
if (SerializationManager.TryDeserialize(source, type, out object obj))
104104
return obj;
105+
if (type.IsArray && type.HasElementType)
106+
{
107+
int size = ReadInt32Packed();
108+
109+
Array array = Array.CreateInstance(type.GetElementType(), size);
110+
111+
for (int i = 0; i < size; i++)
112+
{
113+
array.SetValue(ReadObjectPacked(type.GetElementType()), i);
114+
}
115+
116+
return array;
117+
}
105118
if (type == typeof(byte))
106119
return ReadByteDirect();
107120
if (type == typeof(sbyte))

MLAPI/Serialization/BitWriter.cs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,22 @@ public void WriteObjectPacked(object value)
6161
{
6262
return;
6363
}
64+
else if (value is Array array)
65+
{
66+
Type elementType = value.GetType().GetElementType();
67+
68+
if (SerializationManager.IsTypeSupported(elementType))
69+
{
70+
WriteInt32Packed(array.Length);
71+
72+
for (int i = 0; i < array.Length; i++)
73+
{
74+
WriteObjectPacked(array.GetValue(i));
75+
}
76+
77+
return;
78+
}
79+
}
6480
else if (value is byte)
6581
{
6682
WriteByte((byte)value);
@@ -161,19 +177,19 @@ public void WriteObjectPacked(object value)
161177
WriteCharPacked((char)value);
162178
return;
163179
}
164-
else if (value.GetType().IsEnum)
180+
else if (value.GetType().IsEnum)
165181
{
166182
WriteInt32Packed((int)value);
167183
return;
168184
}
169-
else if (value is GameObject)
185+
else if (value is GameObject)
170186
{
171187
NetworkedObject networkedObject = ((GameObject)value).GetComponent<NetworkedObject>();
172-
if(networkedObject == null)
188+
if (networkedObject == null)
173189
{
174190
throw new ArgumentException("BitWriter cannot write GameObject types that does not has a NetworkedObject component attached. GameObject: " + ((GameObject)value).name);
175-
}
176-
else
191+
}
192+
else
177193
{
178194
WriteUInt64Packed(networkedObject.NetworkId);
179195
}
@@ -183,19 +199,19 @@ public void WriteObjectPacked(object value)
183199
{
184200
WriteUInt64Packed(((NetworkedObject)value).NetworkId);
185201
return;
186-
}
202+
}
187203
else if (value is NetworkedBehaviour)
188204
{
189205
WriteUInt64Packed(((NetworkedBehaviour)value).NetworkId);
190206
WriteUInt16Packed(((NetworkedBehaviour)value).GetBehaviourId());
191207
return;
192-
}
208+
}
193209
else if (value is IBitWritable)
194210
{
195211
((IBitWritable)value).Write(this.sink);
196212
return;
197-
}
198-
213+
}
214+
199215

200216
throw new ArgumentException("BitWriter cannot write type " + value.GetType().Name);
201217
}

MLAPI/Serialization/SerializationManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ internal static FieldInfo[] GetFieldsForType(Type type)
141141
/// <returns>Whether or not the type is supported</returns>
142142
public static bool IsTypeSupported(Type type)
143143
{
144-
return type.IsEnum || SupportedTypes.Contains(type) || type.HasInterface(typeof(IBitWritable)) ||
145-
(cachedExternalSerializers.ContainsKey(type) && cachedExternalDeserializers.ContainsKey(type));
144+
return type.IsEnum || SupportedTypes.Contains(type) || type.HasInterface(typeof(IBitWritable)) ||
145+
(cachedExternalSerializers.ContainsKey(type) && cachedExternalDeserializers.ContainsKey(type)) ||
146+
(type.IsArray && type.HasElementType && IsTypeSupported(type.GetElementType()));
146147
}
147148
}
148149
}

0 commit comments

Comments
 (0)