public static UserLedgerEntry02 Deserialize(byte[] buffer)
        {
            UserLedgerEntry02 e = UserLedgerEntry02.New();

            int bufferBase = 0;

            // Entity Header fields
            e.___entityserializationsignature = buffer[bufferBase++];
            if (!e.CheckEntitySerializationSignature())
            {
                e.OnChangeState(EntitySerialization02.EntityState.EXCEPTION_DESERIALIZATION_ENTITYSIGNATURE); return(e);
            }
            e.___entityserializationversion = buffer[bufferBase++];
            if (!e.CheckEntitySerializationVersion())
            {
                e.OnChangeState(EntitySerialization02.EntityState.EXCEPTION_DESERIALIZATION_ENTITYVERSION); return(e);
            }
            e.___fieldserializationversion = buffer[bufferBase++];
            if (!e.CheckFieldSerializationVersion())
            {
                e.OnChangeState(EntitySerialization02.EntityState.EXCEPTION_DESERIALIZATION_FIELDVERSION); return(e);
            }


            if (!e.CheckEntitySerializationSignature())
            {
                e.OnChangeState(EntitySerialization02.EntityState.EXCEPTION_DESERIALIZATION_ENTITYSIGNATURE); return(e);
            }
            if (!e.CheckEntitySerializationVersion())
            {
                e.OnChangeState(EntitySerialization02.EntityState.EXCEPTION_DESERIALIZATION_ENTITYVERSION); return(e);
            }
            if (!e.CheckFieldSerializationVersion())
            {
                e.OnChangeState(EntitySerialization02.EntityState.EXCEPTION_DESERIALIZATION_FIELDVERSION); return(e);
            }

            e.___entitystate = (EntitySerialization02.EntityState)buffer[bufferBase++];
            e.___nfields     = buffer[bufferBase++];

            // Entity System fields
            e.__entitytypehash = FieldSerialization02.GetByteArray(buffer, ref bufferBase);
            e.__created        = FieldSerialization02.GetInt64(buffer, ref bufferBase);
            e.__modified       = FieldSerialization02.GetInt64(buffer, ref bufferBase);
            e.__changeindex    = FieldSerialization02.GetInt64(buffer, ref bufferBase);

            // Entity Data fields
            e._id         = FieldSerialization02.GetInt32(buffer, ref bufferBase);
            e._username   = FieldSerialization02.GetString(buffer, ref bufferBase);
            e._passphrase = FieldSerialization02.GetString(buffer, ref bufferBase);

            e.OnChangeAllFieldValues(EntitySerialization02.EntityState.DESERIALIZED);

            return(e);
        }
        public byte[] Serialize()
        {
            if (___entitystate == EntitySerialization02.EntityState.UNINITIALIZED)
            {
                Initialize();
            }

            EntitySerialization02.EntityState oldState = OnChangeState(EntitySerialization02.EntityState.SERIALIZED);

            byte[][] fieldBuffer = new byte[this.___nfields][];

            // Entity System fields
            fieldBuffer[0] = FieldSerialization02.GetFieldBuffer(this.__entitytypehash);
            fieldBuffer[1] = FieldSerialization02.GetFieldBuffer(this.__created);
            fieldBuffer[2] = FieldSerialization02.GetFieldBuffer(this.__modified);
            fieldBuffer[3] = FieldSerialization02.GetFieldBuffer(this.__changeindex);

            // Entity Data fields
            fieldBuffer[3] = FieldSerialization02.GetFieldBuffer(this._id);
            fieldBuffer[4] = FieldSerialization02.GetFieldBuffer(this._username);
            fieldBuffer[5] = FieldSerialization02.GetFieldBuffer(this._passphrase);

            int lBuffer = EntitySerialization02.NHEADERFIELDS * sizeof(byte);

            for (int fi = 0; fi < ___nfields; fi++)
            {
                lBuffer += fieldBuffer[fi].Length;                                     // Entity System fields plus Entity data fields
            }
            byte[] buffer     = new byte[lBuffer];
            int    bufferBase = 0;

            // Entity Header fields
            buffer[bufferBase++] = ___entityserializationsignature;
            buffer[bufferBase++] = ___entityserializationversion;
            buffer[bufferBase++] = ___fieldserializationversion;
            buffer[bufferBase++] = (byte)___entitystate;
            buffer[bufferBase++] = ___nfields;

            // Entity System fields plus Entity data fields
            for (int fi = 0; fi < ___nfields; fi++)
            {
                if (bufferBase + fieldBuffer[fi].Length > lBuffer)
                {
                    OnChangeState(EntitySerialization02.EntityState.EXCEPTION_SERIALIZATION);
                    return(Array.Empty <byte>());
                }
                fieldBuffer[fi].CopyTo(buffer, bufferBase);
                bufferBase += fieldBuffer[fi].Length;
            }

            ___entitystate = oldState;

            return(buffer);
        }
        public byte[] Serialize()
        {
            if (___entitystate == EntitySerialization02.EntityState.UNINITIALIZED)
            {
                Initialize();
            }

            EntitySerialization02.EntityState oldState = OnChangeState(EntitySerialization02.EntityState.SERIALIZED);

            byte[][] fieldBuffer = new byte[this.___nfields][];

            // Entity System fields
            fieldBuffer[0] = FieldSerialization02.GetFieldBuffer(this.__entitytypehash);
            fieldBuffer[1] = FieldSerialization02.GetFieldBuffer(this.__created);
            fieldBuffer[2] = FieldSerialization02.GetFieldBuffer(this.__modified);
            fieldBuffer[3] = FieldSerialization02.GetFieldBuffer(this.__changeindex);

            // Entity Data fields
            fieldBuffer[4] = FieldSerialization02.GetFieldBuffer(this._imageVersion);
            fieldBuffer[5] = FieldSerialization02.GetFieldBuffer(this._imageName);
            fieldBuffer[6] = FieldSerialization02.GetFieldBuffer(this._imageContent);

            // Blockchain data fields
            fieldBuffer[7]  = FieldSerialization02.GetFieldBuffer(this.__previousentityBlockindex);
            fieldBuffer[8]  = FieldSerialization02.GetFieldBuffer(this.__previousentityTxhash, false); // FieldEncoding.ASCIIString
            fieldBuffer[9]  = FieldSerialization02.GetFieldBuffer(this.__previousentityContentHash);
            fieldBuffer[10] = FieldSerialization02.GetFieldBuffer(this.__thisentityRecentBlockIndex);
            fieldBuffer[11] = FieldSerialization02.GetFieldBuffer(this.__thisentityContentHash);

            int lBuffer = EntitySerialization02.NHEADERFIELDS * sizeof(byte);

            for (int fi = 0; fi < ___nfields; fi++)
            {
                lBuffer += fieldBuffer[fi].Length;                                     // System + Entity + Blockchain data fields
            }
            byte[] buffer          = new byte[lBuffer];
            int    fieldBufferBase = 0;

            // Entity Header fields
            buffer[fieldBufferBase++] = ___entityserializationsignature;
            buffer[fieldBufferBase++] = ___entityserializationversion;
            buffer[fieldBufferBase++] = ___fieldserializationversion;
            buffer[fieldBufferBase++] = (byte)___entitystate;
            buffer[fieldBufferBase++] = ___nfields;

            // System + Entity + Blockchain data fields - copy all fields except __thisentityContentHash
            for (int fi = 0; fi < ___nfields - 1; fi++)
            {
                if (fieldBufferBase + fieldBuffer[fi].Length > lBuffer)
                {
                    OnChangeState(EntitySerialization02.EntityState.EXCEPTION_SERIALIZATION);
                    return(Array.Empty <byte>());
                }

                fieldBuffer[fi].CopyTo(buffer, fieldBufferBase);
                fieldBufferBase += fieldBuffer[fi].Length;
            }

            // Set __thisentityContentHash and encode it into the buffer
            using (SHA256 SHA256Factory = SHA256.Create())
            {
                __thisentityContentHash = SHA256Factory.ComputeHash(buffer, 0, fieldBufferBase);
                fieldBuffer[___nfields - 1].CopyTo(buffer, fieldBufferBase);
                fieldBufferBase += fieldBuffer[___nfields - 1].Length;
            }

            ___entitystate = oldState;

            return(buffer);
        }