public JObject GetJson(bool encoded)
        {
            string contextData = string.Empty;
            string contentData = string.Empty;

            byte[] data = ContextData;

            if (data != null)
            {
                if (encoded)
                {
                    data = IoMessageUtils.EncodeBase64(data);
                }
                contextData = StringUtils.NewString(data);
            }

            data = ContentData;
            if (data != null)
            {
                if (encoded)
                {
                    data = IoMessageUtils.EncodeBase64(data);
                }
                contentData = StringUtils.NewString(data);
            }

            var json = new JObject
            {
                { IdFieldName, Id },
                { TagFieldName, Tag },
                { GroupIdFieldName, GroupId },
                { SequenceNumberFieldName, SequenceNumber },
                { SequenceTotalFieldName, SequenceTotal },
                { PriorityFieldName, Priority },
                { TimestampFieldName, Timestamp },
                { PublisherFieldName, Publisher },
                { AuthIdFieldName, AuthId },
                { AuthGroupFieldName, AuthGroup },
                { VersionFieldName, Version },
                { ChainPositionFieldName, ChainPosition },
                { HashFieldName, Hash },
                { PreviousHashFieldName, PreviousHash },
                { NonceFieldName, Nonce },
                { DifficultyTargetFieldName, DifficultyTarget },
                { InfoTypeFieldName, InfoType },
                { InfoFormatFieldName, InfoFormat },
                { ContextDataFieldName, contextData },
                { ContentDataFieldName, contentData }
            };

            return(json);
        }
        public IoMessage(JObject json, bool decode) : this()
        {
            if (json[IdFieldName] != null)
            {
                Id = json[IdFieldName].ToObject <string>();
            }
            if (json[TagFieldName] != null)
            {
                Tag = json[TagFieldName].ToObject <string>();
            }
            if (json[GroupIdFieldName] != null)
            {
                GroupId = json[GroupIdFieldName].ToObject <string>();
            }
            if (json[SequenceNumberFieldName] != null)
            {
                SequenceNumber = json[SequenceNumberFieldName].ToObject <int>();
            }
            if (json[SequenceTotalFieldName] != null)
            {
                SequenceTotal = json[SequenceTotalFieldName].ToObject <int>();
            }
            if (json[PriorityFieldName] != null)
            {
                Priority = json[PriorityFieldName].ToObject <sbyte>();
            }
            if (json[TimestampFieldName] != null)
            {
                Timestamp = json[TimestampFieldName].ToObject <long>();
            }
            if (json[PublisherFieldName] != null)
            {
                Publisher = json[PublisherFieldName].ToObject <string>();
            }
            if (json[AuthIdFieldName] != null)
            {
                AuthId = json[AuthIdFieldName].ToObject <string>();
            }
            if (json[AuthGroupFieldName] != null)
            {
                AuthGroup = json[AuthGroupFieldName].ToObject <string>();
            }
            if (json[VersionFieldName] != null)
            {
                Version = json[VersionFieldName].ToObject <short>();
            }
            if (json[ChainPositionFieldName] != null)
            {
                ChainPosition = json[ChainPositionFieldName].ToObject <long>();
            }
            if (json[HashFieldName] != null)
            {
                Hash = json[HashFieldName].ToObject <string>();
            }
            if (json[PreviousHashFieldName] != null)
            {
                PreviousHash = json[PreviousHashFieldName].ToObject <string>();
            }
            if (json[NonceFieldName] != null)
            {
                Nonce = json[NonceFieldName].ToObject <string>();
            }
            if (json[DifficultyTargetFieldName] != null)
            {
                DifficultyTarget = json[DifficultyTargetFieldName].ToObject <int>();
            }
            if (json[InfoTypeFieldName] != null)
            {
                InfoType = json[InfoTypeFieldName].ToObject <string>();
            }
            if (json[InfoFormatFieldName] != null)
            {
                InfoFormat = json[InfoFormatFieldName].ToObject <string>();
            }
            if (json[ContextDataFieldName] != null)
            {
                string contextDataString = json[ContextDataFieldName].ToObject <string>();
                if (decode)
                {
                    ContextData = IoMessageUtils.DecodeBase64(contextDataString.GetBytes());
                }
                else
                {
                    ContextData = contextDataString.GetBytes();
                }
            }

            if (json[ContentDataFieldName] != null)
            {
                string contentDataString = json[ContentDataFieldName].ToObject <string>();
                if (decode)
                {
                    ContentData = IoMessageUtils.DecodeBase64(contentDataString.GetBytes());
                }
                else
                {
                    ContentData = contentDataString.GetBytes();
                }
            }
        }