private static byte[] ObjectToBytes(TObject outObject) { var payload = new List <byte[]>(); var fieldSizeProvider = SerializationHelper.GetValue(FieldSizeProvider, outObject); foreach (var valueOrdinal in FieldValueOrdinals) { MemberInfo sizeOrdinal; if (!FieldSizeOrdinals.TryGetValue(valueOrdinal.Key, out sizeOrdinal)) { throw new V4ObjectSerializationException("Failed to serialize object."); } var value = SerializationHelper.GetValue(valueOrdinal.Value, outObject); if (value == null) { throw new V4ObjectSerializationException("Failed to serialize object."); } byte[] asBytes = null; if (value is string) { asBytes = Encoding.UTF8.GetBytes((string)value); } else if (value is IEnumerable) { var asEnumerable = (IEnumerable)value; var byteList = new List <byte>(); foreach (var item in asEnumerable) { byteList.AddRange(Miscellaneous.ConcatArrays(Miscellaneous.StructToBytes(item), new byte[] { 0x0 })); } asBytes = byteList.ToArray(); } if (asBytes == null) { throw new V4ObjectSerializationException("Failed to serialize object."); } SerializationHelper.SetValue(sizeOrdinal, fieldSizeProvider, asBytes.Length); payload.Add(asBytes); } payload.Add(new byte[] { 0 }); var header = Miscellaneous.StructToBytes(fieldSizeProvider); var result = Miscellaneous.ConcatArrays(header, payload); return(result); }