Got an issue with an invalid JSON object being read from a USB stick, causing the JsonConverter.DeserializeObject
to, what I assume, get stuck in a recursive call as it increases memory usage by 0.5% every 5 seconds, eventually causing the SCM20260E to run out of memory and crash.
As I’m unable to attach the file containing the JSON, I guess I can email it upon request. Here is a subpart of the JSON that I assume is causing the issue:
{
"MessageQueueObject" : [
{
"ResendAttempts" : 0,
"MessageDTO" : {
"Id" : "712bccda-b5f6-2474-2f67-6106f3728610",
"ComponentId" : "",
"DeliveryTag" : 0,
"MessageType" : 11,
"SendAck" : false,
"Value" : "{ \"Id\" : \"8babcc94-66aa-4997-bc60-b48203f5b3e6\", \"Quality\" : true, \"TimeStamp\"1791 �K���X�X�����Xָ��1792 �#՚�X�X��՚�X����1793 �W ��X�X�� ��Xeθ��1794 �7M��X�X��M��X����1795 �>���X�X�����X!����1796 �����X�X�����X$����1797 ��X�X��X'����1798 �"��X�X��"��X*f���1799 ��V��X�X��W��X-����1800 �����X�X�����X0���1801 �M˜�X�X��˜�X3p���1802 ���X�X����X6����1803 ��9��X�X��:��X9����1804 �"p��X�X��q��X<����1805 �����X�X�����X?y���1806 �=杺X�X��杺XBu���1807 ����X�X����XE����1808 ��P��X�X��P��XH����1809 �����X�X�����XK����1810 �|���X�X�����XN����1811 �,���X�X�����XQ����1812 �S<��X�X��<��XT����1813 �nr��X�X��r��XW����1814 ��'��X�X��'��XZ����1815 ��\��X�X��]��X]����1816 �$���X�X�����X`]���1817 �nҠ�X�X��Ҡ�Xc����1818 �<��X�X����Xf����1819 ��K��X�X��K��Xi����1820 �����X�X�����Xl����1821 �Tá�X�X��á�Xo����1822 ����X�X����Xr}���1823 ��8��X�X��9��Xu����1824 �kt��X�X��t��Xxq���1825 �����X�X�����X{����1826 �T梺X�X��梺X~Z���1827 �e(��X�X��(��X�v���1828 ��[��X�X��[��X�����1829 �a���X�X�����X�y���1830 �,ͣ�X�X��ͣ�X�o���1831 �Ua��X�X��a��X�t���1832 ��6��X�X��7��X�x���1833 �eo��X�X��o��X�����1834 �J���X�X�����X�����1835 �Xݤ�X�X��ݤ�X�p���1836 �} ��X�X�� ��X�����1837 �eT��X�X��T��X�M���1838 �����X�X�����X�p���1839 �����X�X��¥�X�d���1840 �8���X�X�����X�����1841 � 2��X�X��2��X�����1842 �ak��X�X��k��X�����1843 �j���X�X�����X�x���1844 �㦺X�X��㦺X�����1845 ���X�X����X�����1846 �LN��X�X��N��X�r���1847 �t��X�X����X�����1848 � =��X�X��=��X�����1849 �Gw��X�X��w��X�����1850 �����X�X�����X�|���1851 ��X�X��墨X�n���1852 ��$��X�X��$��X�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Stamp\" : \"2024-05-26T21:04:55.627Z\", \"Value\" : 50.0130005, \"diff\" : 0.00100000005, \"IntervalSeconds\" : 3600}"
}
}]
}
Method call:
StorageLogFile baseObject = (StorageLogFile)_jsonConvertWrapper.DeserializeObject(
log,
typeof(StorageLogFile),
JsonObjectType.StorageLogFile);
Test class:
using System;
using System.Text;
using GHIElectronics.TinyCLR.Data.Json;
namespace Hardware.JSON
{
public enum JsonObjectType
{
StorageLogFile,
}
public class JsonConvertWrapper
{
public virtual object DeserializeObject(string jsonStr, Type type, JsonObjectType jsonObjectType)
{
InstanceFactory factory = null;
switch (jsonObjectType)
{
case JsonObjectType.StorageLogFile: //Rename
factory = MessageQueueObjectArray;
break;
}
return JsonConverter.DeserializeObject(jsonStr, type, factory);
}
private object MessageQueueObjectArray(string instancePath, JToken token, Type baseType, string fieldName, int length)
{
if (instancePath == "//MessageQueueObject")
{
return new MessageQueueObject();
}
if (fieldName == "MessageQueueObject")
{
return new MessageQueueObject[length];
}
if (baseType == typeof(MessageDTO)) return new MessageDTO();
if (baseType == typeof(StorageLogFile)) return new StorageLogFile();
{
}
public class StorageLogFile
{
public MessageQueueObject[] MessageQueueObject;
}
public class MessageQueueObject
{
public int ResendAttempts { get; set; }
public MessageDTO MessageDTO { get; set; }
}
}