// Deserialization public Decimal Deserialize() { // Read info about storage format DecimalStorageFormats format = (DecimalStorageFormats)SerializerStorage.ReadStorageFormatId(DecimalStorageBase.FormatIdSizeInBits); // Is it default value if (format == DecimalStorageFormats.DefaultValue) { return(Decimal.Zero); } // Size of data in buffer PositiveValueInDataStream positiveValueInDataStream = new PositiveValueInDataStream(); positiveValueInDataStream.FormatConfig.Bits = SerializerStorage.ReadStorageFormatData(PositiveValueInDataStream.UsedConfigBitsForCase); byte packedDataSize = (byte)positiveValueInDataStream.PackedDataSize; // Data byte[] packedData = SerializerStorage.ReadPackedData(packedDataSize); // Buffer int[] decimalBuffer = new int[4]; int intPos = 0; int byteShift = 0; // Restore value for (int pos = 0; pos < packedDataSize; pos++) { decimalBuffer[intPos] |= packedData[pos] << byteShift; byteShift += 8; byteShift %= 8; if (byteShift == 0) { intPos++; } } // Is it NegativeValueInDataStream) storage case if (format == DecimalStorageFormats.NegativeValueInDataStream) { return(new Decimal(decimalBuffer) * (-1)); } // Is it PositiveValueInDataStream storage case // DecimalStorageFormats.PositiveValueInDataStream return(new Decimal(decimalBuffer)); }
// Constructor that requires config case value public DecimalStorageBase(DecimalStorageFormats confCase, byte usedConfigBits) : base((byte)confCase, FormatIdSizeInBits, usedConfigBits) { }